两个线程,一个读一个写:
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更新就不及时了。但我也不希望硬把连个线程交替执行,那样的话双方都要等,浪费好多时间。我到底应该怎么做呢?谢谢!
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更新就不及时了。但我也不希望硬把连个线程交替执行,那样的话双方都要等,浪费好多时间。我到底应该怎么做呢?谢谢!
解决方案 »
- 我想学自己编写一个类,请教下有什么教材是教人写类的
- 请教有关坐标图的绘制问题
- 马踏棋盘:估计是递归回搠时出了问题,想了很久没有办法解决
- 救急,帮我看一下代码,是关于CHTTPConnection 的,老有问题
- Warning: no message line prompt for ID 0x8014.是何意思。
- 参数转换求助
- 作业不会做,请帮忙!
- 为何在调试win32程序结束后经常会非法操作,导致VC6.0被关闭?
- !!!!!我的简单的数据库交换问题,帮帮我啊。万王大小虾们来啊!!!!
- 怎样在NT中记录文件的访问
- 怎么设置 CComboBox下拉列表的长度
- 我用atl写了一个com 在vb和asp里怎么调用?
Sleep(0);
这应该是系统资源浪费的地方
用Event/WaitForSingleObject代替?