首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

线程的同步有关问题,帮忙看看

2012-02-16 
线程的同步问题,帮忙看看假设有代码1classA2{3//成员变量4boolm_isQuit5CSomeClassm_file67//成员函数8f

线程的同步问题,帮忙看看
假设有代码
1class   A
2{
3//成员变量
4bool   m_isQuit;
5CSomeClass   m_file;
6
7//成员函数
8function   ThreadBody
9{
10Somefunction();
11if(m_isQuit)
12{
13return;
14}
15m_file.doSomethingBBWithBlock();//这是个阻塞函数,只有m_file.Close()时才会返回
16return;
17}
18
19function   Terminate()
20{
21m_isQuit   =   true;
22m_file.Close();//会使第15句的阻塞函数立即返回
23}
24}
我的代码里面执行两个线程T1和T2,T1用的线程函数是A的实例a里面的ThreadBody。T2则是执行同一个实例a里面的Terminate。
我的目的是无论T1执行到哪一步时,都能通过执行T2,将T1中止。
下面是线程执行的四种情况:(线程:行号)
第一种第二种第三种第四种
T1:10T1:10T1:10T1:10
T2:21T1:11T2:21T1:11
T2:22T2:21T1:11T2:21
T1:11T2:22T2:22T1:15
T1:13T1:15T1:13T2:22
第一种T1返回,达到目的第二种继续阻塞,T1无法返回,没有达到目的第三种T1返回,达到目的第四种T1返回,达到目的
由于第二种没有达到目的,所以这段代码需要调整。请问应该如何加入同步控制机制,达到最终目的?




[解决办法]
这个问题看上去有点难。如果T2在T1执行11之前执行了21,T1会终止。如果没有,那么T1终止的唯一机会就是在执行15之后等待T2执行22。很显然,如果T2在这之前执行了22,那么T1就没有机会终止了。换句话说,这个时候应该确保
15 m_file.doSomethingBBWithBlock();

22 m_file.Close();
之前执行。而15是个阻塞操作,这里不可能用同步机制使得22在15后执行。当然,这个问题可能也是可以解决的,只是我没想到:)
[解决办法]
semaphore有一个预give特性。这是其它同步、阻塞进制不太有的。
你的程序如果不支持这个特性,解决起来恐怕很困难。

热点排行