大家看我前一主题帖上面的图了吧
7 r) c7 m9 e8 [& ~6 H 输出大概是这个样子,但是为什么会有乱码呢?难道是实时操作系统线程出问题了吗?1 B- d. U* m/ i' x2 J0 _ 这里就要说一下显示乱码的原因了4 S1 G3 c1 M; x5 A9 _/ w 之所以需要线程同步是因为在多线程并行执行的情况下,有可能会造成多线程同时使用同一系统资源的情况,从而造成冲突的发生,影响程序执行的正确性,在操作系统中一般使用互斥锁与信号量来实现线程同步2 l3 @5 P' T' P' v5 I 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目' Z& B/ \, w' f. V# M. E0 X5 k 所以,我们可以给线程在调用时加个判断,判断的内容就是线程里面的信号量或者是互斥量。) U) Y" y+ g6 e- X) _! q5 o. s #include "rtos.h" #include "mbed.h" Serial pc(USBTX,USBRX);; t( i! `, E3 E6 F 1 J3 r3 X, I) ` Mutex stdio_mutex; // Semaphore slots(1); uint8_t theadindex[3]; 6 H$ B& l: N3 p2 i9 R& [! N long count[3];" z; s8 j% @7 V/ D6 E# U, N/ x 9 X1 _- z f9 I( f% N1 j void printstr(void const *args) {& h3 o3 E( \6 c while (true) {/ y% J% h7 | J V3 I stdio_mutex.lock();//slots.wait(); pc.printf("Hello World,My Thread Name is %d,Thread ID is %d.\n",*(uint8_t *)args,Thread::gettid()); count[*(uint8_t *)args-1]++;) u1 p3 D2 n8 f/ P: @) C 4 Y8 I* O8 P$ r! T' W( V stdio_mutex.unlock();//slot.release(); + i$ `8 r. _6 A3 [ Thread::yield();9 ?8 ~ @0 G, X0 ^ e# \ }3 P: }( _$ {/ v: z- T+ S S" | * |1 m7 h; a" Y0 Y# d1 g# h }$ }" k' Q1 M( ` int main() ) b- {; j+ Q" m* ^1 c' _* J { ! C+ v, o9 s% b theadindex[0]=1; theadindex[1]=2;+ p+ s6 J$ ^/ A: h- ` 5 B# X! [% u% P/ A- X( ? theadindex[2]=3; Thread thread1(printstr,(void *)theadindex,osPriorityNormal);- o* v/ g3 J7 c2 N+ N! g4 f Thread thread2(printstr,(void *)(theadindex+1),osPriorityNormal); Thread thread3(printstr,(void *)(theadindex+2),osPriorityNormal);- {; d q- K6 G3 O) \7 G" x: F+ y while (1)- [: |( [) D) R$ N8 D { stdio_mutex.lock();//slots.wait(); , i& m. ?& m! M% k1 Y, T5 q! A pc.printf("Thread1 count is %ld,Thread2 count is %ld,,Thread3 count is %ld. \n",count[0],count[1],count[2]);0 ^) b/ k; p7 A 5 J. T9 x0 K" d( Y" i, N stdio_mutex.unlock();//slot.release();7 k+ l- \- c: y# z7 p F Thread::wait(1000); 7 h% V& Z( g) q' [: B1 s, \/ b! g } }7 X- E& b4 e B; d1 b4 X mbed-rtos另外还提供了一种称为Signals(信号)的精简同步模式,在这种模式下,一个线程必须等到特定的信号到来才继续,而另外一个线程则负责发送该信号
|
| 看来我也要学习一下了,看起来好好玩的样子 |
|
|
| 学习下!! |
| 非常好,学习了一下 |
| 非常感谢楼主的分想 |
| 帮顶,还没有用过RTOS |
| 我会发更加好的帖子的 |
微信公众号
手机版