互斥量能够保证在微观层面同一时刻仅有一个线程处理变量,但是不能保证执行顺序,更不能在某一时刻,一个线程通知另一个线程开始开始处理相关任务。
#define __SIZEOF_PTHREAD_MUTEXATTR_T 4
typedef union
{
char __size[__SIZEOF_PTHREAD_CONDATTR_T];
int __align;
} pthread_condattr_t;
int pthread_condattr_destroy(pthread_condattr_t *attr);
int pthread_condattr_init(pthread_condattr_t *attr);
pthread_condattr_init
pthread_condattr_destroy
int pthread_cond_destroy(pthread_cond_t *cond);
int pthread_cond_init(pthread_cond_t *restrict cond,
const pthread_condattr_t *restrict attr);
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
初始化与销毁条件变量。
pthread_cond_init
NULL
,则以默认的条件变量属性进行初始化pthread_cond_destroy
int pthread_cond_timedwait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex,
const struct timespec *restrict abstime);
int pthread_cond_wait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex);
pthread_cond_timedwait
该函数使线程处于阻塞状态到指定的时间,如果在指定的时间内,还未等到信号,则退出等待int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond);
pthread_cond_signal
解除多个堵塞在同一个条件变量上的线程中的其中一个
pthread_cond_broadcast
解除所有阻塞在通过条件变量上的所有线程
源码
线程一启动后进入阻塞状态,等待信号的到来。线程二在启动后,等待5秒后发出信号。
#include
#include
#include
#include
pthread_mutex_t mutex;
pthread_cond_t cond;
void *start_routine_01(void *ptr)
{
printf("进入阻塞状态...\n");
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
printf("获得信号以解除阻塞状态...\n");
pthread_mutex_unlock(&mutex);
return (void *)NULL;
}
void *start_routine_02(void *ptr)
{
printf("等待5秒后发出解除信号...\n");
sleep(5);
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);
printf("解除信号已发出...\n");
pthread_mutex_unlock(&mutex);
return (void *)NULL;
}
int main(int argc, char const *argv[])
{
{
pthread_mutexattr_t attr; // 定义互斥属性
pthread_mutexattr_init(&attr); // 初始化互斥属性
pthread_mutex_init(&mutex, &attr); // 初始化互斥
pthread_mutexattr_destroy(&attr); // 销毁互斥属性
}
{
pthread_condattr_t attr; // 定义条件变量属性
pthread_condattr_init(&attr); // 初始化条件变量属性
pthread_cond_init(&cond, &attr); // 初始化条件变量
pthread_condattr_destroy(&attr); // 销毁条件变量属性
}
pthread_t thread_id_01;
pthread_t thread_id_02;
pthread_create(&thread_id_01, NULL, start_routine_01, NULL);
pthread_create(&thread_id_01, NULL, start_routine_02, NULL);
pthread_join(thread_id_01, NULL);
pthread_join(thread_id_02, NULL);
pthread_mutex_destroy(&mutex); // 销毁互斥
pthread_cond_destroy(&cond); // 销毁条件变量
exit(EXIT_SUCCESS);
}
输出
进入阻塞状态…
等待5秒后发出解除信号…
解除信号已发出…
获得信号以解除阻塞状态…