📄 subject_65179.htm
字号:
<p>
序号:65179 发表者:badboy 发表日期:2003-12-16 09:49:03
<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>
回复者:zzjhsj 回复日期:2003-12-16 11:41:07
<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>
回复者:badboy 回复日期:2003-12-16 12:09:51
<br>内容:我举个例子,现在有两个线程。一个线程为a,另一个线程为b.还有一个临界区变量。没有什么其他的同步条件给你用。还有一个全局变量d <BR><BR> 当主线程先后产生两个线程a和b后,要求,必须先让线程a完成对d的访问,再让线程b对d的进行访问。只用这个临界区你就能实现???<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>
回复者:zzjhsj 回复日期:2003-12-16 13:42:34
<br>内容:thread1-->thread2-->thread1-->thread2.....<BR><BR>class thelock<BR>{<BR> int _k;<BR> CRITICAL_SECTION _cs;<BR>public:<BR> thelock()<BR> {<BR> _k=0;<BR> InitializeCriticalSection(&_cs);<BR> }<BR><BR> ~thelock()<BR> {<BR> DeleteCriticalSection(&_cs); <BR> }<BR><BR> void lock_thread1()<BR> {<BR> for(;;)<BR> {<BR> EnterCriticalSection(&_cs);<BR> if(_k%2==0)<BR> {<BR> ++_k;<BR> break;<BR> }<BR><BR> LeaveCriticalSection(&_cs);<BR> Sleep(0);<BR> }<BR> }<BR><BR> void lock_thread2()<BR> {<BR> for(;;)<BR> {<BR> EnterCriticalSection(&_cs);<BR> if(_k%2 != 0)<BR> {<BR> ++_k;<BR> break;<BR> }<BR><BR> LeaveCriticalSection(&_cs);<BR> Sleep(0);<BR> }<BR> }<BR><BR> void unlock()<BR> {<BR> LeaveCriticalSection(&_cs);<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>
<font color=red>答案被接受</font><br>回复者:zzjhsj 回复日期:2003-12-16 13:56:47
<br>内容://测试程序<BR><BR>thelock lock;<BR>int e=0;<BR>void thread1(void*)<BR>{<BR> for(;!e;)<BR> {<BR> lock.lock_thread1();<BR> Sleep(200);<BR> printf("%d\n",GetCurrentThreadId());<BR> lock.unlock();<BR>// Sleep(200);<BR> }<BR> <BR> _endthread();<BR>}<BR><BR>void thread2(void*)<BR>{<BR> for(;!e;)<BR> {<BR> lock.lock_thread2();<BR> Sleep(200);<BR> printf("%d\n",GetCurrentThreadId());<BR> lock.unlock();<BR>// Sleep(200);<BR> }<BR> <BR> _endthread();<BR>}<BR><BR><BR>int _tmain(int argc, _TCHAR* argv[])<BR>{<BR> _beginthread(thread1,1024,NULL);<BR> _beginthread(thread2,1024,NULL);<BR><BR> e=getch();<BR> getch();<BR> return 0;<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>
回复者:badboy 回复日期:2003-12-16 18:01:47
<br>内容:这个程序你设计的很巧妙! 牛!牛!真牛!<BR><BR> 不过,上面而二楼里的那个程序的同步方式好象不是采用你的方法啊?<BR><BR><BR>//thread1-->thread2-->thread1-->thread2.....<BR>#include "iostream.h"<BR>#include <stdio.h><BR>#include "process.h"<BR>#include "windows.h"<BR>#include <conio.h><BR>class thelock<BR>{<BR> int _k;<BR> CRITICAL_SECTION _cs;<BR>public:<BR> thelock()<BR> {<BR> _k=0;<BR> InitializeCriticalSection(&_cs);<BR> }<BR> ~thelock()<BR> {<BR> DeleteCriticalSection(&_cs); <BR> }<BR><BR> int get()<BR> {return _k;}<BR><BR> void lock_thread1()<BR> {<BR> for(;;)<BR> {<BR> EnterCriticalSection(&_cs);<BR> if(_k%2==0)<BR> {<BR> ++_k;<BR> break;<BR> }<BR><BR> LeaveCriticalSection(&_cs);<BR> Sleep(0);<BR> }<BR> }<BR><BR> void lock_thread2()<BR> {<BR> for(;;)<BR> {<BR> EnterCriticalSection(&_cs);<BR> if(_k%2 != 0)<BR> {<BR> ++_k;<BR> break;<BR> }<BR> LeaveCriticalSection(&_cs);<BR> Sleep(0);<BR> }<BR> }<BR><BR> void unlock()<BR> {<BR> LeaveCriticalSection(&_cs);<BR> }<BR>};<BR><BR>thelock lock;<BR>int e=0;<BR>void thread1(void*)<BR>{<BR> for(;!e;)<BR> {<BR> lock.lock_thread1();<BR> printf("%d\n",GetCurrentThreadId());<BR> cout<<lock.get()<<endl;<BR> <BR> lock.unlock();<BR> }<BR> _endthread();<BR>}<BR><BR>void thread2(void*)<BR>{<BR> for(;!e;)<BR> {<BR> lock.lock_thread2();<BR> printf("%d\n",GetCurrentThreadId());<BR> cout<<lock.get()<<endl;<BR> <BR> lock.unlock();<BR> }<BR> _endthread();<BR>}<BR><BR>int main()<BR>{<BR> _beginthread(thread1,1024,NULL);<BR> _beginthread(thread2,1024,NULL);<BR> e=getch();<BR> getch();<BR><BR> return 0;<BR>}<BR>
<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 + -