你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

rtos的线程同步的方法

[复制链接]
一花一世界003 发布时间:2015-2-11 10:21
大家看我前一主题帖上面的图了吧 QQ截图20150209184227.png " |- n- q& y4 C; \. s3 c5 q

1 e  g2 T6 P: K/ m" I( P3 n. r输出大概是这个样子,但是为什么会有乱码呢?难道是实时操作系统线程出问题了吗?! ^  T7 ^4 f/ [. }# \$ t; x
这里就要说一下显示乱码的原因了
& x0 x+ J; i) b  n0 B1 Y; K之所以需要线程同步是因为在多线程并行执行的情况下,有可能会造成多线程同时使用同一系统资源的情况,从而造成冲突的发生,影响程序执行的正确性,在操作系统中一般使用互斥锁与信号量来实现线程同步
% A; n1 M5 K, g0 V8 |+ M5 Q只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享! M! ^6 [3 u! `6 K; s" ?9 ?0 |
信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目! x  M! J' g! e' x; F. G. A
所以,我们可以给线程在调用时加个判断,判断的内容就是线程里面的信号量或者是互斥量。6 n. ~- G. l% I/ e( G4 ?8 p0 P
#include "rtos.h"
3 e. u8 [, w6 K' l6 ^5 u5 N' a#include "mbed.h"
% v% @7 Z( z; d3 l% YSerial pc(USBTX,USBRX);. D8 M% A- S5 x/ H6 d

1 i( [9 `6 Z0 a" O% yMutex stdio_mutex; // Semaphore slots(1);' S& D0 R. [" W& q
; m* o: W- e) g- @
uint8_t theadindex[3];, f. f4 K7 |. u2 d$ P
) ^3 j' j0 r' Z2 Z- E4 i# n( o) a
long count[3];' a5 Y  L  J- v% K5 E, f( c7 \

* r' `5 a! [5 M' }) F; |void printstr(void const *args)
: K2 H8 l8 |  R4 f4 n& l3 o3 m! y1 n4 f- E# g- P3 W; h: f
{9 D) ]) e1 v: i. L4 A8 ?! v
, y  b' y; j" X; ], Z7 Z
    while (true) {
8 o; e, F7 C9 K
& y% D1 X# H* c! O* `( R9 m                        stdio_mutex.lock();//slots.wait();
+ O- C7 M0 U6 h. f& T. W
" U, t4 s  d. t3 ~) J" k$ Y6 R3 ^, P+ |                        pc.printf("Hello World,My Thread Name is %d,Thread ID is %d.\n",*(uint8_t *)args,Thread::gettid());# Q: [( A8 }6 L1 I, h. a% E7 m

2 c; E! p9 N) `, g( Z! p% P                        count[*(uint8_t *)args-1]++;3 X8 R( d: s+ [- ]' L# T0 P

* F8 B+ O' e- [& M/ G( x( V2 s                        stdio_mutex.unlock();//slot.release();
1 {" U6 g" M/ M1 Z
$ z1 W; ?' i3 n$ N) p( q                        Thread::yield();
* M2 h6 \0 G$ o* _4 S- A: I$ r; n1 j( A: t! q  J/ H6 X
    }
, z3 h0 k1 ?8 }* K8 B; z
; u& U; Z% `3 S. O4 G}5 L+ H8 C5 |  t. S; W

. Q) i4 m- o& b0 V+ j% qint main()
  o' b: E4 a# s% R3 a
5 d- }/ M2 K; X" i* ]{* h& [2 X+ {# f; p2 U8 g+ ~9 G, [

/ V: p' l/ X; w3 L% X/ b8 @    theadindex[0]=1;
- g# W4 t: h: C$ e. \, u
! q) |; o+ T$ ?* A% D+ ~    theadindex[1]=2;& m# A, a8 D" f; D

6 f% O, Z1 D4 B; c; t    theadindex[2]=3;! ^8 @2 q2 s2 `
9 a8 k' q- x- s6 O! G- p6 y
    Thread thread1(printstr,(void *)theadindex,osPriorityNormal);
7 E( _& f$ |) U1 {+ |8 m4 {5 c0 ~  c5 {* P6 d
    Thread thread2(printstr,(void *)(theadindex+1),osPriorityNormal);0 V- `& P  P5 ^9 C# V* K0 a
/ K( c' r6 }) q
    Thread thread3(printstr,(void *)(theadindex+2),osPriorityNormal);
- P$ }& X; }7 h* m7 a* ~% S; Q4 h% Z2 I6 Q: `% O
    while (1)
% ~  i& @8 R* S7 x. d& D  a
4 |9 a: k; A8 H7 v! {    {/ y6 b; K5 h! s! S2 a, ^2 Q% `
/ W, J4 e# f# @
                        stdio_mutex.lock();//slots.wait();) {* [5 y! ]9 y5 u. k/ P
4 S- W1 C+ @" _8 a  F% G
                        pc.printf("Thread1 count is %ld,Thread2 count is %ld,,Thread3 count is %ld. \n",count[0],count[1],count[2]);  I( r/ G5 \4 u& O  c- _. @* y

( ]2 G' R: r6 B% M  A& Y' ^, ^                        stdio_mutex.unlock();//slot.release();
9 u5 ]- e5 `5 g' l  n2 T1 v5 X" @- ^0 b8 y
                        Thread::wait(1000);
/ P  C- I* V- z2 O5 o
4 e8 i" s7 S, o- z+ H3 H$ ]! Y  V    }: D5 R; l4 c2 g" M7 U
}
- K1 u# }' _% Z, o; e' mmbed-rtos另外还提供了一种称为Signals(信号)的精简同步模式,在这种模式下,一个线程必须等到特定的信号到来才继续,而另外一个线程则负责发送该信号
' a$ K. i+ w( T4 f# t, N& ` QQ截图20150211101941.png
4 e( e) H& ?1 H, t0 V; S2 \: g

+ F5 ^+ }# `5 `% u" p; a) I8 P; t
收藏 评论10 发布时间:2015-2-11 10:21

举报

10个回答
埃斯提爱慕 回答时间:2015-2-11 11:03:50
提示: 作者被禁止或删除 内容自动屏蔽
aderson 回答时间:2015-2-11 11:37:03
看来我也要学习一下了,看起来好好玩的样子
默罕默德.ST 回答时间:2015-2-11 11:45:31
hdx.jpg
默罕默德.ST 回答时间:2015-2-11 11:45:47
aaaaaaaaa.jpg
lkl0305 回答时间:2015-2-11 12:34:41
学习下!!
蚂蚁 回答时间:2015-2-11 14:26:22
非常好,学习了一下
蚂蚁 回答时间:2015-2-11 14:26:38
非常感谢楼主的分想
北斗光寒 回答时间:2015-2-11 14:46:42
帮顶,还没有用过RTOS
埃斯提爱慕 回答时间:2015-2-12 11:18:46
提示: 作者被禁止或删除 内容自动屏蔽
一花一世界003 回答时间:2015-2-12 12:39:02
我会发更加好的帖子的

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版