gpt4 book ai didi

c - SetEvent 和 WaitForMultipleObjects 的不可预测行为

转载 作者:太空宇宙 更新时间:2023-11-04 06:36:36 25 4
gpt4 key购买 nike

我正在尝试使用 SetEventWaitForMultipleObjects 所以我写了几个函数,我想使用事件来同步它们。我希望第一个函数执行,然后指示第二个函数执行,这又指示第一个函数再次执行等。

创建了两个事件,一个初始化为有信号状态,另一个为无信号状态。让执行按预期进行的唯一方法是让每个线程休眠 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)

如果不使用 sleep ,那么有时同一个函数会在 while 循环中运行几次,而不是在两个函数之间来回切换。有什么想法吗?

最佳答案

您可以通过在每个函数的 SetEvent 调用上方添加 printf 来解决此问题。

问题是您正在设置事件然后执行一些输出。

function2 中,printf 发生在 SetEvent 之后:

// Add a printf call here to see sensible output.
if(!SetEvent (FinUpdatestructCalcpid))
printf("Couldn't set the event FinUpdatestructCalcpid\n");
else{
// Thread is pre-empted by kernel here. This is not executed immediately
printf("FinUpdatestructCalcpid event set\n");
}

内核 preempts运行 function2 的线程,因此现在已设置 FinUpdatestructCalcpid 事件,但没有您期望的相应 printf

然后执行运行 function1 的线程并设置 FinUpdatestructCalcpid 事件。运行 function2 的线程现在被允许执行并从它停止的地方继续。它运行 printf 并且因为 FinUpdatestructCalcpid 事件已设置,它会立即再次运行。

您正在使用的 Sleep() 调用有助于使这种竞争条件不太可能发生,但不要消除它。

关于c - SetEvent 和 WaitForMultipleObjects 的不可预测行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14270091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com