23,216
社区成员




#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
HANDLE hMutex = NULL;
const int nWaitTime = 1000;
const int nSleepTime = 200;
int main()
{
hMutex = ::CreateMutex(0, FALSE, NULL);
while (true)
{
int nRet = ::WaitForSingleObject(hMutex, nWaitTime);
if (WAIT_OBJECT_0 == nRet)
{
printf("Succeed!\n");
}
else if (WAIT_TIMEOUT == nRet)
{
printf("Time Out!\n");
}
else if (WAIT_ABANDONED == nRet)
{
printf("Abandoned!\n");
}
else if (WAIT_FAILED == nRet)
{
printf("Failed!\n");
}
else
{
printf("other error!\n");
}
::Sleep(nSleepTime);
::ReleaseMutex(hMutex);
}
::CloseHandle(hMutex);
return 0;
}
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t g_mutex;
pthread_cond_t g_cond;
int main()
{
pthread_mutex_init(&g_mutex, NULL);
while (true)
{
struct timespec ts;
ts.tv_sec = time(NULL) + 2;
ts.tv_nsec = 0;
int nRet = 0;
pthread_mutex_lock(&g_mutex);
nRet = pthread_cond_timedwait(&g_cond, &g_mutex, &ts);
if (nRet == 0)
{
printf("succeed!\n"); // 这边一直都进不来
}
else if (nRet == 110)
{
printf("time out!\n");
}
else
{
printf("timedwait error!\n");
}
pthread_mutex_unlock(&g_mutex);
pthread_cond_signal(&g_cond);
sleep(1);
}
return 0;
}
mutex_lock() //锁住检查共享变量value
while(value!=xxx) //发现value还没有达到想要的结果
{
//于是睡眠并释放互斥锁(允许其他线程/进程可以获取互斥锁修改共享拜纳凉value)
pthread_cond_wait(mutex);
// 被其他线程/进程唤醒,锁住互斥量,循环检查value==xxx是否成立
}
//value==xxx了,于是可以对共享变量value做一些事情,此时仍然锁住互斥量,因为value是共享的
mutex_unlock() //修改完毕,释放互斥量
pthread_mutex_lock(&g_mutex);
/*
这两个函数之间的窗口,由这两个函数来保护。
加锁是为了原子访问,用于条件检测的变量。
比如:
while (g_count == 0) { // 这个才是条件
*/
nRet = pthread_cond_timedwait(&g_cond, &g_mutex, &ts);
/*
}
*/