📄 subject_38639.htm
字号:
<p>
序号:38639 发表者:不好玩 发表日期:2003-05-05 09:10:25
<br>主题:关于线程同步的问题
<br>内容:我现在有两个线程<BR>假定有一全局变量A<BR>现在第一个线程要对A进行写操作<BR>第二线程要对他读操作<BR>如果不用FOR或WHILE语句我想可以用事件或临界区解决<BR>要死的就要用到FOR或WHILE<BR>我现在就要用第一个线程的值(当然这个值也要实时来写)<BR>来确定退出第二个线程的FOR或WHILE循环<BR>我想了好久,没有想出好的方法<BR>不知哪位对线程有更多的研究<BR>能否指点一下!!!!
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:Neil Gan 回复日期:2003-05-05 10:41:18
<br>内容:根据intel规范,对界的32bit读/写是原子操作,而只要你没有修改默认得对齐参数,DWORD总是对界的。因此,你对此DWORD的操作不需要任何同步,只要你的每个线程只是读或写,而不是既读又写。<BR><BR>DWORD gdwFlag=0;<BR>void Thread01(void)<BR>{<BR> ...<BR> CreateThread(Thread02,...);<BR> ...<BR> gdwFlag=1; //Signal the second thread<BR> ...<BR>}<BR><BR>void Thread02(void)<BR>{<BR> while (0 == gdwFlag)<BR> {<BR> ...<BR> }<BR> ...<BR>}<BR><BR>但是你要知道一点,因为你不知道Thread02何时被调度,所以while循环可能一次也没有执行到。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:不好玩 回复日期:2003-05-05 10:45:36
<br>内容:我写了一个小程序进行测试<BR>上传给你瞧瞧<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Neil Gan 回复日期:2003-05-05 10:56:28
<br>内容:我看过你的程序了,但还是不知道你想测试的是什么?<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:不好玩 回复日期:2003-05-05 10:59:29
<br>内容:我现在好像出错了啊<BR>我现在只要他显示的是1500以下的数据<BR>为何超过1500的数据还显示出来呢
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Neil Gan 回复日期:2003-05-05 11:02:02
<br>内容:只有你点ok的时候才显示出来。因为你用的是do-while循环,无论条件判断结果是什么,至少会执行一次。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:不好玩 回复日期:2003-05-05 11:05:56
<br>内容:对于全局变量<BR>一个在读一个在写好像总觉得有点不对啊<BR>我查了许多书都说要用线程同步<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:不好玩 回复日期:2003-05-05 11:09:20
<br>内容:我现在用WHILE语句为什么它什么都不显示了呢<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Neil Gan 回复日期:2003-05-05 11:09:41
<br>内容:你把ReadThread中的Sleep改为Sleep(200)就可以看到:你判断了g_lCount之后,WriteThread又修改了它。<BR><BR>当你的两个线程都是对它既读又写时,你就需要同步。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:不好玩 回复日期:2003-05-05 11:15:39
<br>内容:刚才是我错了<BR>我将ReadThread线程去掉就好了<BR>但是我想还是要用同步,但是我不知如何来解决<BR>能否指点一下用什么同步好啊
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Neil Gan 回复日期:2003-05-05 11:19:10
<br>内容:I already told you, if one of your thread write the global variable only, and another thread read it only, you don't need any synchronization.<BR><BR>If you want to sync in the same process, use Critical Section, which is the fastest.<BR><BR>If you want to sync in different process, you can use mutex.<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:不好玩 回复日期:2003-05-05 11:24:04
<br>内容:但是临界区与互斥量何时用呢<BR>我没有地方可加这语句啊<BR>能不能说得更明白一些啊
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Neil Gan 回复日期:2003-05-05 11:27:19
<br>内容:What do you want to do? If you only want to do this, YOU DON'T HAVE TO USE any synchronization.<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:不好玩 回复日期:2003-05-05 11:32:32
<br>内容:我现在做的程序就卡在这里了<BR>我现在正在写一个程序<BR>一个线程要实时读数据<BR>另外一个线程要对数据进行判定后进行其它操作<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Neil Gan 回复日期:2003-05-05 11:37:34
<br>内容:说清楚一点
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:不好玩 回复日期:2003-05-05 11:42:30
<br>内容:其实思路就是上面那样的<BR>一个线程读数据<BR>别外一个线程对读的数据进行判断<BR>是否在WHILE循环内<BR>此时一个线程在读,一个线程在写<BR>所以要用同步<BR>就如上面的READTHREAD与WRETETHREAD<BR>我在没有挂起线程之前<BR>两个线程都要运行<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Neil Gan 回复日期:2003-05-05 11:45:50
<br>内容:你的那个程序有什么地方不符合你的要求?<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:不好玩 回复日期:2003-05-05 11:50:08
<br>内容:没有啊<BR>但是两个线程同时访问了同一变量啊<BR>不会发生共享冲突啊<BR>我对线程第一次写<BR>不大懂,只有多问一下了<BR>很谢谢NEIL GAN 大侠
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Neil Gan 回复日期:2003-05-05 11:55:12
<br>内容:我再说一遍:如果你只是想做这个的话,你不需要同步。<BR>但是,在你的程序中,ReadThread可能会Send大于1500的数字。你可以把里面的Sleep改大看一看结果<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:不好玩 回复日期:2003-05-05 12:23:27
<br>内容:好的<BR>我先试试<BR>不过很谢谢你<BR>我开始运行时没有发现什么问题<BR>但是我怕以后哪一天出问题<BR>没有别的原因<BR>只是我懂得不多<BR>我读过线程的书讲如果对一全局量同时进行读操作与写操作时<BR>要用同步,我觉得我的程序开了两个线程<BR>并且在某时刻会同时读写<BR>不过我先试试有没有问题<BR>我对INTER规范也不懂
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -