打印

学习实时操作系统中的疑问,关于信号量

[复制链接]
3297|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

请问各位高手,信号量如何对应到信号量实例?
/*
2 * 程序清单:动态信号量
3 *
4 * 这个例子中将创建一个动态信号量(初始值为0 )及一个动态线程,在这个动态线程中
5 * 将试图采用超时方式去持有信号量,应该超时返回。然后这个线程释放一次信号量,并
6 * 在后面继续采用永久等待方式去持有信号量, 成功获得信号量后返回。
7 */
8 #include <rtthread.h>
9 #include "tccomm.h"
10
11 /* 指向线程控制块的指针*/
12 static rtthreadt tid = RTNULL;
13 /* 指向信号量的指针*/
14 static rtsemt sem = RTNULL;
15 /* 线程入口*/
16 static void threadentry(void* parameter)
17 {
18 rterrt result;
19 rttickt tick;
20
21 /* 获得当前的OS Tick */
22 tick = rttickget();
23
24 /* 视图持有一个信号量,如果10个OS Tick依然没拿到,则超时返回*/
25 result = rtsemtake(sem, 10);
26 if (result == -RTETIMEOUT)
27 {
28 /* 判断是否刚好过去10个OS Tick */
29 if (rttickget() - tick != 10)

30 {
31 /* 如果失败,则测试失败*/
32 tcdone(TCSTATFAILED);
33 rtsemdelete(sem);
34 return;
35 }
36 rtkprintf("take semaphore timeout\n");
37 }
38 else
39 {
40 /* 因为并没释放信号量,应该是超时返回,否则测试失败*/
41 tcdone(TCSTATFAILED);
42 rtsemdelete(sem);
43 return;
44 }
45
46 /* 释放一次信号量*/
47 rtsemrelease(sem);
48
49 /* 继续持有信号量,并永远等待直到持有到信号量*/
50 result = rtsemtake(sem, RTWAITINGFOREVER);
51 if (result != RTEOK)
52 {
53 /* 返回不正确,测试失败*/
54 tcdone(TCSTATFAILED);
55 rtsemdelete(sem);
56 return;
57 }
58
59 /* 测试成功*/
60 tcdone(TCSTATPASSED);
61 /* 删除信号量*/
62 rtsemdelete(sem);
63 }
64
65 int semaphoredynamicinit()
66 {
67 /* 创建一个信号量,初始值是0 */
68 sem = rtsemcreate("sem", 0, RTIPCFLAGFIFO);
69 if (sem == RTNULL)
70 {
71 tcstat(TCSTATEND j TCSTATFAILED);
72 return 0;
73 }
74
75 /* 创建线程*/
76 tid = rtthreadcreate("thread",
77 threadentry, RTNULL, /* 线程入口是threadentry, 入口参数是RTNULL */
78 THREADSTACKSIZE, THREADPRIORITY, THREADTIMESLICE);
79 if (tid != RTNULL)
80 rtthreadstartup(tid);
81 else
82 tcstat(TCSTATEND j TCSTATFAILED);

83
84 return 0;
85 }
86
87 #ifdef RTUSINGTC
88 static void tccleanup()
89 {
90 /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断*/
91 rtentercritical();
92
93 /* 删除线程*/
94 if (tid != RTNULL && tid->stat != RTTHREADCLOSE)
95 {
96 rtthreaddelete(tid);
97
98 /* 删除信号量*/
99 rtsemdelete(sem);
100 }
101
102 /* 调度器解锁*/
103 rtexitcritical();
104
105 /* 设置TestCase状态*/
106 tcdone(TCSTATPASSED);
107 }
108
109 int tcsemaphoredynamic()
110 {
111 /* 设置TestCase清理回调函数*/
112 tccleanup(tccleanup);
113 semaphoredynamicinit();
114
115 /* 返回TestCase运行的最长时间*/
116 return 100;
117 }
118 /* 输出函数命令到finsh shell中*/
119 FINSHFUNCTIONEXPORT(tcsemaphoredynamic, a dynamic semaphore example);
120 #else
121 /* 用户应用入口*/
122 int rtapplicationinit()
123 {
124 semaphoredynamicinit();
125
126 return 0;
127 }
128 #endif

相关帖子

沙发
aozima| | 2012-11-1 12:54 | 只看该作者
本帖最后由 aozima 于 2012-11-1 12:59 编辑

假设有2块空闲空间可用,就把信号量初始为2。
用之前take一下,信号量值就减1,用完就释放一次,信号量值就加1。

使用特权

评论回复
板凳
阿南| | 2012-11-1 14:04 | 只看该作者
恩,二楼是OS方面的专家

使用特权

评论回复
地板
houfire007|  楼主 | 2012-11-1 14:24 | 只看该作者
假设有2块空闲空间可用,就把信号量初始为2。
用之前take一下,信号量值就减1,用完就释放一次,信号量值就加1。
aozima 发表于 2012-11-1 12:54

嗯。。。
你所说的有两个条件:
1.有空闲空间
2.空闲空间有2快。
ok,我疑惑的地方就是:信号量只和空闲块数量有关系和是什么样的空闲空间没关系吗?如果没关系如何协调线程对“某一”公共资源(比如某一公共资源是一个确定全局的buffer)的访问?如果有关系,那么怎么和公共资源扯上关系?
学习操作系统不久,疑惑比较多,请大家帮我解答,另外如果是我思维进入死胡同麻烦指条明路,非常感谢。

使用特权

评论回复
5
gtekled| | 2012-11-1 16:20 | 只看该作者
我也来学习下

使用特权

评论回复
6
aozima| | 2012-11-1 18:17 | 只看该作者
本帖最后由 aozima 于 2012-11-1 18:20 编辑
信号量只和空闲块数量有关系和是什么样的空闲空间没关系吗?
这个。。。

如何协调线程对“某一”公共资源(比如某一公共资源是一个确定全局的buffer)的访问?

情景 --> 有一公共资源:buffer。线程A的职责是向里面写数据,线程B的职责是从里面读数据并打印出来。

buffer只有一个,所以信号量初始值为1。
线程写入数据前先获取信号量,此时信号值减为0,并进行操作。
在操作过程中,线程B也需要读取buffer,也需要先获取信号量,但此时信号量值为0,于是在此等待(是否等等待及等待多久可设置)。

当A写完buffer后,释放信号量,此时信号量值加1;
如果有线程挂起在此信号量上面,就唤醒挂起在信号上面的线程(线程B),此时信号量值再次减1;
此时线程B的sem_take返回,并进行打印操作,
打印完成后,释放信号量。

不过以上情景,建议使用互斥量。

使用特权

评论回复
7
houfire007|  楼主 | 2012-11-2 09:36 | 只看该作者
6# aozima 从我现在看到的一些信号量的例程确实没看到信号量如何和公共资源有直接联系的(可能见识太少)。那么,是否我之前的想法是错误的,也就是说把信号量当成某一确定资源的守护者的想法是错误的。而是他只和线程有关系,打个比方:信号量是信号灯,线程是车,资源是可以行使的马路,大于0仅仅表示可以用(绿灯),小于等于0就必须等待或者挂起(红灯或者黄灯)。而绿灯之后,车往前还是往左由车自己决定。当然交通灯可以显示那边的可以用(比如说可以同时指示前面和左边的方向可以走),而信号量只显示有没有可以用的。如果是我这样的解释,那么如果有2资源,其中一个一直是空闲的另一块是两个线程使用的这种情况是不是不能用信号量?


给个情景:有2个公共buffer,buffer1和buffer2;4个线程,假设为tid1,tid2,tid3和tid4。tid1写buffer1,tid2读buffer1,tid3写buffer2,tid4读buffer2。这种情况如何使用信号量解决同步问题,一个信号量可以解决吗?问得有点多,麻烦了。


使用特权

评论回复
8
aozima| | 2012-11-2 10:02 | 只看该作者
多想,多实验。

除了信号量,还有互斥量,内存池等等,合理选用。

使用特权

评论回复
9
原野之狼| | 2012-11-2 10:38 | 只看该作者
原来是RTT呀...
RTT在21IC推广不力,呵呵~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

69

帖子

0

粉丝