是 POSIX 线程库中用于初始化条件变量的函数,属于多线程编程的基础同步机制。其主要作用是为条件变量分配资源并设置属性,配合互斥锁实现线程间通信与协调 [1]。
该函数原型为,其中指向待初始化的条件变量,可指定属性(如进程间共享或进程内共享)。函数成功返回 0,失败返回错误码。初始化方式分为静态(通过宏)和动态(通过函数自定义属性),初始化后需调用释放资源 [1]。
遵循 POSIX 线程标准,定义了条件变量的核心操作规范,是构建线程同步原语的基础接口之一。其实现通常基于底层互斥锁和信号量机制,相关操作函数(如等待、信号通知)定义于头文件 [1]。
术语介绍
播报编辑
它的原型为:
extern int pthread_cond_init __P ((pthread_cond_t *__cond,__const pthread_condattr_t *__cond_attr));
其中cond是一个指向结构pthread_cond_t的指针,
cond_attr是一个指向结构pthread_condattr_t的指针。
结构pthread_condattr_t是条件变量的属性结构,和互斥锁一样我们可以用它来设置条件变量是进程内可用还是进程间可用,默认值是PTHREAD_ PROCESS_PRIVATE,即此条件变量被同一进程内的各个线程使用;如果选择为PTHREAD_PROCESS_SHARED则为多个进程间各线程公用。注意初始化条件变量只有未被使用时才能重新初始化或被释放。
返回值:函数成功返回0;任何其他返回值都表示错误。
释放一个条件变量的函数为pthread_cond_ destroy(pthread_cond_t *cond)。
初始化方式
播报编辑
静态赋值法
将宏结构常量PTHREAD_COND_INITIALIZER赋予互斥锁:
pthread_cond_t cond = PTHREAD_COND_INITIALIZER
使用函数
使用pthread_cond_init函数
示例:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; /*初始化互斥锁*/
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; //初始化条件变量
void *thread1(void *);
void *thread2(void *);
int i=1;
int main(void)
{
pthread_t t_a;
pthread_t t_b;
pthread_create(&t_a,NULL,thread1,(void *)NULL);/*创建进程t_a*/
pthread_create(&t_b,NULL,thread2,(void *)NULL); /*创建进程t_b*/
pthread_join(t_b, NULL);/*等待进程t_b结束*/
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
exit(0);
}
void *thread1(void *junk)
{
for(i=1;i<=9;i++)
{
printf("IN one\n");
pthread_mutex_lock(&mutex);//
if(i%3==0)
pthread_cond_signal(&cond);/*条件改变,发送信号,通知t_b进程*/
else
printf("thead1:%d\n",i);
pthread_mutex_unlock(&mutex);//*解锁互斥量*/
printf("Up Mutex\n");
sleep(10);
}
}
void *thread2(void *junk)
{
while(i<9)
{
printf("IN two \n");
pthread_mutex_lock(&mutex);
if(i%3!=0)
pthread_cond_wait(&cond,&mutex);/*等待*/
printf("thread2:%d\n",i);
pthread_mutex_unlock(&mutex);
printf("Down Mutex\n");
sleep(10);
}
}
