关于pthread条件变量的一个例子,其中的重点是:
1.pthread_cond_wait会先将调用线程放到等待条件的线程列表上,也就是说线程会阻塞,传递进去的互斥量会解锁;
2.pthread_cond_wait返回时互斥量会再次锁住。
带着这两个要点去看下面的程序,thread1负责打印i的值,thread2负责决定打印的条件。thread1首先锁住lock是为了保证在pthread_cond_signal调用之前首先进入pthread_cond_wait状态。在pthread_cond_wait下线程休眠等待信号并且解锁lock,这样thread2开始运行并且当条件满足时thread2获取lock并调用pthread_cond_signal通知thread1开始打印i。pthread_cond_signal之后解锁lock,这样thread1可以重新锁定lock,并且返回打印出i的值,最后thread1解锁lock开始下一轮循环。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
int i = 0;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void* thread1(void *arg)
{
for (;;)
{
printf("thread1 loop...\n");
pthread_mutex_lock(&lock);
printf("thread1 wait cond...\n");
pthread_cond_wait(&cond, &lock);
printf("thread1 work...%d\n", i);
pthread_mutex_unlock(&lock);
}
return (void*)0;
}
void* thread2(void *arg)
{
sleep(1);
while (++i < 100)
{
printf("thread2 loop...\n");
if (i % 10 == 0)
{
pthread_mutex_lock(&lock);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&lock);
sleep(1);
}
}
printf("thread2 exit\n");
return (void*)0;
}
int main(void)
{
pthread_t ntid1;
pthread_t ntid2;
pthread_create(&ntid1, NULL, thread1, NULL);
pthread_create(&ntid2, NULL, thread2, NULL);
pthread_join(ntid1, NULL);
pthread_join(ntid2, NULL);
pthread_mutex_destroy(&lock);
pthread_cond_destroy(&cond);
return EXIT_SUCCESS;
}