我正在尝试使用SetEvent
,WaitForMultipleObjects
因此我编写了几个我想使用事件同步的函数。我希望第一个函数执行,然后发出第二个函数执行的信号,这反过来又发出第一个函数再次执行的信号,依此类推。
创建了两个事件,一个初始化为有信号状态,另一个初始化为无信号状态。我可以让执行按预期进行的唯一方法是让每个线程休眠 10 毫秒。我阅读了有关使用 SetEvent 的一些注意事项:http: //cboard.cprogramming.com/windows-programming/100818-setevent-resetevent-3.html
我的问题是我必须让我的线程进入睡眠状态,因为这些函数调用需要额外的时间来实际发出事件信号吗?有时调试时,设置的事件仍然未发出信号。我使用流程资源管理器验证了这一点。我的代码基本上是这样的:
主要是:
//1. FinCalcpidUpdatestruct << initialize to unsignalled
//2. FinUpdatestructCalcpid << initialize to signalled
FinCalcpidUpdatestruct = CreateEvent (NULL, FALSE, FALSE, TEXT("FinCalcpidUpdatestruct"));
FinUpdatestructCalcpid = CreateEvent (NULL, FALSE, TRUE, TEXT ("FinUpdatestructCalcpid"));
void function1()
{
int n;
int noGoCode;
n=0;
noGoCode = 0;
while(1)
{
//Sleep(10);
noGoCode = WaitForSingleObject (FinCalcpidUpdatestruct, INFINITE);
if (noGoCode == WAIT_OBJECT_0) {
//wait for FinCalcpidUpdatestruct to be signalled
BufferOut[n] = pid_data_array -> output;
//signal FinUpdatestructCalcpid
if(!SetEvent (FinUpdatestructCalcpid))
printf("Couldn't set the event FinUpdatestructCalcpid\n");
else{
printf("FinUpdatestructCalcpid event set\n");
Sleep(10);
}
}
else
printf("error\n");
}
}
void function2()
{
int nGoCode = 0;
while(1)
{
//wait for FinUpdatestructCalcpid to be signalled
// Sleep(10);
nGoCode = WaitForSingleObject (FinUpdatestructCalcpid, INFINITE);
if (nGoCode == WAIT_OBJECT_0) {
if(!SetEvent (FinCalcpidUpdatestruct))
printf("Couldn't set the event FinCalcpidUpdatestruct\n");
else{
printf("FinCalcpidUpdatestruct event set\n");
Sleep(10);
}
}
else
printf("error\n");
}//end while(1)
如果不使用睡眠,那么有时同一个函数会在 while 循环中运行几次,而不是在两个函数之间来回反复。有任何想法吗?