下面是一个简单的多线程程序,一个用于“读”的线程,一个用于“写”的线程。
两个线程通过一个hSemaphore 互斥,
“写”线程每次向缓冲区BufferTest写入数据。
第一次写如ab。。ij,接着转到读线程,读出数据
第二次写入bc。。jk,接着转到读线程,读出数据。
重复10次。
如果我在标注了//BreakPoint的地方设置断点,再单步跟踪就正确输出
abcdefghij
bcdefghijk
cdefghijkl
defghijklm
efghijklmn
fghijklmno
ghijklmnop
hijklmnopq
ijklmnopqr
如果一次运行的话就输出
jklmnopqrs
jklmnopqrs
jklmnopqrs
jklmnopqrs
jklmnopqrs
jklmnopqrs
jklmnopqrs
jklmnopqrs
jklmnopqrs
jklmnopqrs
各位帮帮忙,小弟先谢了。。。。。。
代码如下:去掉了错误处理
#include<iostream.h>
#include<windows.h>
HANDLE hSemaphore;
CHAR BufferTest[10];
INT nWriteFirstChar=97;//
void WriteThread(char *p1)
{
char* pToBuffer=p1;//BreakPoint
int i=0;
for (int iter=0;iter<10;iter++)
{
WaitForSingleObject(hSemaphore,INFINITE);
while(i++<10)
{
*pToBuffer++=(char)nWriteFirstChar++;
}
nWriteFirstChar-=9;
i=0;
pToBuffer=p1;
ReleaseSemaphore(hSemaphore,1,0);
}
return;
}
void ReadThread(char *p2)
{
static int i=0;
while (i++<10)
{
WaitForSingleObject(hSemaphore,INFINITE);
cout<<p2<<endl;//BreakPoint
ReleaseSemaphore(hSemaphore,1,0);
}
return;
}
void main()
{
HANDLE hThread[2]; //Handles of two threads
DWORD dwIDWriteThread; //IDofWriteThread
DWORD dwIDReadThread; //IDofReadThread
__try
{
hSemaphore=CreateSemaphore(0,1,1,0);
hThread[0]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)
WriteThread,BufferTest,0 ,&dwIDWriteThread);
hThread[1]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)
ReadThread,BufferTest,0 ,&dwIDReadThread);
WaitForMultipleObjects(2,hThread,true,INFINITE);
}
__finally
{
CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
CloseHandle(hSemaphore);
exit(0);
}
}
UP!!!UP!!!UP!!!UP!!!UP!!!UP!!!UP!!!UP!!!
WriteThread()完成后才ReadThread()故输出都是jklmnopqrs.
WriteThread 一直在执行(WaitForSingleObject 没有产生效果), ReadThread 在 WrtieThread 执行间得不到时间片执行。
原因是 WriteThread 中 ReleaseSemaphore(hSemaphore,1,0); 产生的资源计数立即被 WriteThread 的 WaitForSingleObject 消耗掉。建议采用两个 Semaphore (其实我认为没必要用 Semaphore,两个 Event 就可以了)
hEvent1 = CreateEvent(NULL, FALSE, TRUE, FALSE);
hEvent2 = CreateEvent(NULL, FALSE, FALSE, FALSE);
// WriteThread
WaitForSingleObject(hEvent1, INFINITE);
...
SetEvent(hEvent2);
// ReadThread
WaitForSingleObject(hEvent2 INFINITE);
...
SetEvent(hEvent1);