互斥体(Mutex)和条件变量(Condition Variable)
互斥体(Mutex)和条件变量(Condition Variable)都是C语言中多线程编程中常用的同步机制,它们的主要差异在于互斥体用于保护临界区(Critical Section)中的共享数据,而条件变量用于在线程之间进行通信和同步。
互斥体是一种线程同步的机制,用于保护临界区中的共享资源,避免多个线程同时对共享资源进行读写,导致数据不一致或者竞态条件的问题。互斥体通常是一个锁,它可以保证同一时刻只有一个线程可以进入临界区,其他线程必须等待当前线程释放锁之后才能进入。
下面是一个简单的使用互斥体实现线程同步的例子代码:
#include <stdio.h>
#include <pthread.h>
// 定义全局变量和互斥体
int sum = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// 线程函数,将1~100的整数相加
void* thread_func(void* arg) {
int i;
for (i = 1; i <= 100; i++) {
// 加锁
pthread_mutex_lock(&mutex);
sum += i;
// 解锁
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
int main() {
// 定义线程ID和属性
pthread_t thread;
pthread_attr_t attr;
pthread_attr_init(&attr);
// 创建线程
pthread_create(&thread, &attr, thread_func, NULL);
// 主线程将1~100的整数相加
int i;
for (i = 1; i <= 100; i++) {
// 加锁
pthread_mutex_lock(&mutex);
sum += i;
// 解锁
pthread_mutex_unlock(&mutex);
}
// 等待子线程结束
pthread_join(thread, NULL);
// 输出结果
printf("sum = %d\n", sum);
return 0;
}
在上面的例子中,我们使用了pthread_mutex_lock和pthread_mutex_unlock函数来加锁和解锁互斥体,以保证线程之间的同步。
条件变量是一种线程间通信的机制,用于在线程之间传递信息和同步,它通常用于等待某个特定事件的发生,例如,等待一个资源变得可用或者等待一个条件满足。条件变量需要和互斥体一起使用,以保证线程之间的同步和互斥。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
pthread_mutex_t mutex;
pthread_cond_t cond;
int count = 0;
void* thread_func(void* arg) {
// 加锁
pthread_mutex_lock(&mutex);
// 等待条件变量
while (count == 0) {
pthread_cond_wait(&cond, &mutex);
}
// 执行任务
printf("thread_func: count = %d\n", count);
// 解锁
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
int main() {
// 定义线程ID和属性
pthread_t thread;
pthread_attr_t attr;
pthread_attr_init(&attr);
// 初始化互斥体和条件变量
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
// 创建线程
pthread_create(&thread, &attr, thread_func, NULL);
// 主线程增加计数器
pthread_mutex_lock(&mutex);
count++;
printf("main: count = %d\n", count);
// 发送信号给条件变量
pthread_cond_signal(&cond);
// 解锁
pthread_mutex_unlock(&mutex);
// 等待子线程结束
pthread_join(thread, NULL);
// 销毁互斥体和条件变量
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
在上面的例子中,我们使用了pthread_cond_wait函数等待条件变量,当计数器count被主线程增加到1时,主线程发送信号给条件变量,使得等待该条件变量的子线程可以继续执行。同时,我们使用了互斥体保护共享数据count,以避免竞态条件的出现。
总的来说,使用条件变量可以实现线程之间的同步和通信,通过pthread_cond_wait和pthread_cond_signal函数的配合使用,可以在线程之间传递信息,使得一个线程等待另一个线程满足某个条件后再继续执行。