条件变量是一种重要的线程同步机制,它允许线程在满足特定条件时被唤醒或阻塞。条件变量通常与互斥锁(Mutex)一起使用,以实现线程间的通信和同步操作。
概念:
条件变量的主要作用是让一个线程等待某个条件成立后再继续执行。当另一个线程改变了这个条件并通知条件变量时,等待的线程会被唤醒。这种机制可以有效地避免竞态条件和饥饿问题。
步骤:
初始化:pthread_cond_init
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
参数:
cond:指向条件变量的指针
attr:NULL
指向条件变量属性的指针。如果
attr
为NULL
,则使用默认的条件变量属性;否则使用attr
中指定的属性返回值:
成功初始化条件变量后返回0。
如果出现错误,返回相应的错误编号
[EBUSY]
:尝试重新初始化已被初始化但尚未销毁的条件变量。[EINVAL]
:传递给attr
的值无效。[E again]
:系统缺乏必要的资源来初始化另一个条件变量#include<pthread.h> int main() { pthread cond; if(pthread_cond_init(&cond,NULL)!=0) //处理错误 } return 0; }
注意事项
- 在线程等待条件变量时,通常需要与互斥锁(mutex)配合使用,以确保线程安全。
- 条件变量在被销毁之前必须先解除所有相关的锁,并且确保没有线程正在等待该条件变量。
总之,pthreadCond_init
是多线程编程中重要的同步机制之一,能够有效地协调多个线程之间的执行顺序和状态变化。
等待条件变量产生:pthread_cond_wait
int pthread_cond_wait(pthread_cond_t * cond, pthread_mutex_t restrict *mutex);
功能:
主要用于条件变量的等待操作。其主要功能是阻塞当前线程,直到另一个线程通过
pthread_cond_signal()
或pthread_cond_broadcast()
唤醒它。参数:
cond:等待条件
restrict mutex:对应的锁
返回值:
0:成功
非0:失败
使用步骤:
1.加锁
pthread_mutex_t mutex; pthread_mutex_lock(&mutex); //在调用pthread_cond_wait之前必须先锁定一个互斥锁mutex //确保线程安全
2.等待条件变量
pthread cond_wait cond; pthread cond_init(&cond); pthread cond_wait(&cond,&mutex);//条件变量、互斥锁指针 //该函数会释放互斥锁,并使当前线程进入阻塞状态 等待条件变量被其他线程唤醒
3.唤醒条件变量
if(符合条件) { pthread_cond_signal cond; pthread_cond_signal(&cond) }
当条件满足时,其他线程可以通过
pthread_cond_signal()
或pthread_cond_broadcast()
来唤醒等待的线程4.解锁
pthread_mutex_unlock(&mutex)
pthread_cond_wait
是多线程编程中实现线程间同步的关键工具。它通过阻塞当前线程并等待条件变量被其他线程唤醒来实现线程间的协调与同步。
产生条件变量:pthread_cond_signal
调用
pthread_cond_signal
函数时,它会唤醒至少一个等待在该条件变量上的线程。然而,实际唤醒哪个线程是由调度策略决定的,并不能保证特定的线程被唤醒。这意味着在多处理器系统中,可能会同时唤醒多个线程,而这些被唤醒的线程需要继续等待以处理任务。功能:
产生条件变量
返回值:
唤醒至少一个等待的线程后返回0,
如果没有任何线程等待,则直接返回
补充:
- 当没有条件产生时pthread_cond_wait函数会阻塞,同时会将锁解开;如果等待到条件产生,函数会结束阻塞同时进行上锁。
- pthread_cond_wait阻塞状态是等待pthread_cond_signal唤醒
- pthread_cond_signal只能唤醒单个cond_wait,相当于一对一;pthread_cond_broadcast可以唤醒多个cond_wait,相当于一对多