线程的同步问题,帮忙看看
假设有代码
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特性。这是其它同步、阻塞进制不太有的。
你的程序如果不支持这个特性,解决起来恐怕很困难。