两个线程,一个读一个写:
CMutex Section;
static unsigned __stdcall WriteThread(LPVOID lpParam)
{
CSingleLock singelLock(&Section);
for(int x = 0; x<100; x++)
{
a++; singelLock.Lock();
c = a;
printf("Write c = %d\n", c);
fresh = 1;
singelLock.Unlock();
}
return 1;
}static unsigned __stdcall ReadThread(LPVOID lpParam)
{
CSingleLock singlelock(&Section);
for(int x = 0; x<100; x++)
{
while(InterlockedExchange(&fresh, 0) == 0)
Sleep(0); singlelock.Lock();
b = c;
printf("b = %d\n", b);
singlelock.Unlock();
          }
return 1;
}目的是想让Read线程对同一个c的值只print一次,所以用了循环锁,但问题是每次在循环锁上耗的时间很长(有90毫秒左右),虽然我已经紧接着用了Sleep。照理说,一旦Sleep,此线程就挂起了,然后Write线程改变了fresh标志,Read线程就可以继续了(我就想它这样)。但现在不,得等Write线程运行了十几二十个循环Read线程才能再次枪到CPU。这可能是因为Write线程采用Lock的方法,导致它总是
尽可能多地占用CPU。但我不希望它这样,否则Read更新就不及时了。但我也不希望硬把连个线程交替执行,那样的话双方都要等,浪费好多时间。我到底应该怎么做呢?谢谢!

解决方案 »

  1.   

    while(InterlockedExchange(&fresh, 0) == 0)
    Sleep(0);
    这应该是系统资源浪费的地方
    用Event/WaitForSingleObject代替?
      

  2.   

    试了一下WaitForSingleObject,看上去好像好了很多。但是仍然会有偶然出现延迟90毫秒,往往这之前刚刚把c print了两次(就是Write线程执行了多个循环),不明白这是为什么。我是使用clock来计时的,也许是计时本身的问题。我在print b之后写finish = clock()并打印时间,接着是start = clock();,然后再退出critical section。我怕如果用GetThreadTimes的话,就无法计算线程间切换的延时了。到底问题出在哪里呢?