首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

编程小知识之 虚假唤醒(spurious wakeup)

拿 Pthread 举例,一个常见的条件变量的使用示例大概是这个样子的: // flag for sync bool g_signaled = false; pthread_mutex_t g_mutex...g_signaled) { pthread_cond_wait(&g_cond, &g_mutex); } g_signaled = false...上述示例代码中,我们在设置 g_signaled 之后调用了 pthread_cond_signal,正常来讲的话,之前调用 pthread_cond_wait 的线程会被唤醒,此时 g_signaled...应该一定为真,但是细心的朋友应该会发现,代码中我们却使用了一个循环来检查 g_signaled 的真值(并在发现 g_signaled 不为真时释放互斥锁然后重新进入了等待(通过重新调用 pthread_cond_wait...g_signaled) { pthread_cond_wait(&g_cond, &g_mutex); } 这么做的一个原因便是为了处理 虚假唤醒(spurious wakeup),

1.9K20
您找到你想要的搜索结果了吗?
是的
没有找到

9.2 运用API实现线程同步

要创建一个manual-reset模式并且初始状态为not-signaled的事件对象,需要按照以下步骤:首先定义一个SECURITY_ATTRIBUTES结构体变量,设置其中的参数为NULL表示使用默认安全描述符...可以通过SetEvent函数将事件对象设置为signaled状态,通过ResetEvent函数将事件对象设置为non-signaled状态,也可以通过WaitForSingleObject或者WaitForMultipleObjects...创建manual-reset模式的事件对象 // 该对象创建后不会被立即执行,只有我们设置状态为Signaled时才会继续 hEvent = CreateEvent(NULL, TRUE, FALSE...如果不更改,对象继续停留在signaled ResetEvent(hEvent); CloseHandle(hEvent); system("pause"); return 0;}9.2.2...状态,大于0时进入signaled状态的特性即可实现线程同步。

27050
领券