【C语言】条件变量(pthread_cond_t)

 一、概述

      条件变量(pthread_cond_t)是POSIX线程(也称为pthread)库中用于线程同步的一种机制。在多线程程序中,条件变量通常与互斥锁(pthread_mutex_t)一起使用,以防止并发问题,如竞态条件和死锁。

二、条件变量(pthread_cond_t)操作函数

1. pthread_cond_init

初始化一个条件变量。

int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);

2. pthread_cond_destroy

销毁条件变量。

int pthread_cond_destroy(pthread_cond_t *cond);

3. pthread_cond_wait

在等待条件变量时,阻塞线程并释放互斥锁。当被pthread_cond_signal或pthread_cond_broadcast唤醒时,线程重新获得锁,并继续执行。

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

4. pthread_cond_timedwait

类似于`pthread_cond_wait`,但加入了超时限制。如果条件在超时之前没有得到满足,函数返回一个错误码。

int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);

5. pthread_cond_signal

唤醒至少一个等待给定条件变量的线程。

int pthread_cond_signal(pthread_cond_t *cond);

6. pthread_cond_broadcast

唤醒所有等待给定条件变量的线程。

int pthread_cond_broadcast(pthread_cond_t *cond);

三、互斥锁(pthread_mutex_t)操作函数

1. pthread_mutex_init

初始化一个互斥锁。

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

2. pthread_mutex_lock

锁定互斥锁。如果已经被锁定,线程将阻塞,直到锁被解锁。

int pthread_mutex_lock(pthread_mutex_t *mutex);

3. pthread_mutex_unlock

解锁互斥锁。

int pthread_mutex_unlock(pthread_mutex_t *mutex);

4. pthread_mutex_destroy

销毁互斥锁。

int pthread_mutex_destroy(pthread_mutex_t *mutex);

四、代码示例

以下是利用条件变量和互斥锁进行线程同步的代码示例:

#include 
#include 
#include 
#include 

// 全局变量
pthread_mutex_t mutex;
pthread_cond_t cond;
int ready = 0;

// 线程函数
void* thread_func(void* arg) {
    // 加锁
    pthread_mutex_lock(&mutex);

    // 等待条件变量变为ready
    while (!ready) {
        pthread_cond_wait(&cond, &mutex);
    }

    printf("Thread %ld is now running.\n", (long)arg);

    // 解锁
    pthread_mutex_unlock(&mutex);
    return NULL;
}

int main(void) {
    pthread_t thread1, thread2;

    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);

    pthread_create(&thread1, NULL, thread_func, (void*)1);
    pthread_create(&thread2, NULL, thread_func, (void*)2);

    sleep(2); // 等待一段时间

    // 加锁
    pthread_mutex_lock(&mutex);

    // 更改条件并唤醒所有等待线程
    ready = 1;
    pthread_cond_broadcast(&cond);

    // 解锁
    pthread_mutex_unlock(&mutex);

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    pthread_cond_destroy(&cond);
    pthread_mutex_destroy(&mutex);

    return 0;
}
在代码中,我们创建了两个线程,它们将等待条件变量`ready`变为1。当`main()`函数中将`ready`设置为1并调用`pthread_cond_broadcast`后,所有等待中的线程将被唤醒并继续执行。

五、流程状态图

【C语言】条件变量(pthread_cond_t)_第1张图片

你可能感兴趣的:(c语言,开发语言)