由于工作上的事情,要用到线程之间的同步,而且有超时处理,在网上看到了使用pthread_cond_timedwait()函数和pthread_cond_wait()函数,其实2个函数都差不多,我主要是要用pthread_cond_timedwait()函数。
pthread_cond_timedwait()函数有三个入口参数:
(1)pthread_cond_t __cond:条件变量(触发条件)
(2)pthread_mutex_t __mutex: 互斥锁
(3)struct timespec __abstime: 等待时间(其值为系统时间 + 等待时间)
当在指定时间内有信号传过来时,pthread_cond_timedwait()返回0,否则返回一个非0数(我没有找到返回值的定义);
在使用pthread_cond_timedwait()函数时,必须有三步:
1:加互斥锁:pthread_mutex_lock(&__mutex)
2:等待:pthread_cond_timedwait(&__cond, &__mutex, &__abstime) //解锁->等待->加锁
3:解互斥锁:pthread_mutex_unlock(&__mutex)
发送信号量时,也要有三步:
1:加互斥锁:pthread_mutex_lock(&__mutex)
2:发送:pthread_cond_signal(&__cond)
3:解互斥锁:pthread_mutex_unlock(&__mutex)
那么,这里就有一个问题,等待的时候已经加上锁了,那么我发送的时候怎么才能运行到发送函数呢?其实这是因为在pthread_cond_timedwait()函数中已经对互斥锁进行解锁操作了,所以这个时候发送信号量是不会阻塞的。其实仔细想想,这样不是才能保证同步吗?(写完代码后考虑一下)
#include
#include
#include
#include
#include
#include
#define SENDSIGTIME 10
pthread_cond_t g_cond;
pthread_mutex_t g_mutex;
void thread1(void *arg)
{
int inArg = (int)arg;
int ret = 0;
struct timeval now;
struct timespec outtime;
pthread_mutex_lock(&g_mutex);
gettimeofday(&now, NULL);
outtime.tv_sec = now.tv_sec + 5;
outtime.tv_nsec = now.tv_usec * 1000;
ret = pthread_cond_timedwait(&g_cond, &g_mutex, &outtime);
//ret = pthread_cond_wait(&g_cond, &g_mutex);
pthread_mutex_unlock(&g_mutex);
printf("thread 1 ret: %d\n", ret);
}
int main(void)
{
pthread_t id1;
int ret;
pthread_cond_init(&g_cond, NULL);
pthread_mutex_init(&g_mutex, NULL);
ret = pthread_create(&id1, NULL, (void *)thread1, (void *)1);
if (0 != ret)
{
printf("thread 1 create failed!\n");
return 1;
}
printf("等待%ds发送信号!\n", SENDSIGTIME);
sleep(SENDSIGTIME);
printf("正在发送信号....\n");
pthread_mutex_lock(&g_mutex);
pthread_cond_signal(&g_cond);
pthread_mutex_unlock(&g_mutex);
pthread_join(id1, NULL);
pthread_cond_destroy(&g_cond);
pthread_mutex_destroy(&g_mutex);
return 0;
}