首页
学习
活动
专区
圈层
工具
发布

编程小知识之 虚假唤醒(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),

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

    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状态的特性即可实现线程同步。

    57250

    第三章--Win32程序的执行单元(部分概念及代码讲解)(上 -- 多线程)

    当发生以下情况时,WaitForSingleObject函数就会返回:     1)要等待的对象变成受信(signaled)状态;     2)参数dwMilliseconds指定的时间已过去了。   ...PS:一个可执行对象有两种状态,未受信(nonsignaled)和受信(signaled)状态。线程对象只有当线程运行结束时才达到受信状态。 7.  ...Count  使用计数(2)             Suspend Count  暂停次数(1)             Exi Code  退出代码(STILL_ACTIVE)             Signaled...是否受信:成员Signaled指定了线程对象是否为“受信”状态。线程在运行期间,Signaled的值永远是FALSE,即“未受信”。只有当线程结束后,系统才会把Signaled的值置为TRUE。

    28210
    领券