首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux条件变量 信号量

Linux 条件变量与信号量基础概念

条件变量(Condition Variables)

条件变量是一种同步机制,用于等待某个条件的成立。它通常与互斥锁(mutex)一起使用,以防止多个线程同时访问共享资源。条件变量允许线程在某个条件不满足时进入睡眠状态,并在条件改变时被唤醒。

主要操作:

  • pthread_cond_wait:等待条件变量,释放互斥锁并进入睡眠状态,直到被其他线程唤醒。
  • pthread_cond_signal:唤醒一个等待该条件变量的线程。
  • pthread_cond_broadcast:唤醒所有等待该条件变量的线程。

信号量(Semaphores)

信号量是一种计数器,用于控制多个进程或线程对共享资源的访问。它有两种基本类型:二进制信号量和计数信号量。

主要操作:

  • sem_wait:尝试减少信号量的值,如果值为零则阻塞。
  • sem_post:增加信号量的值,并可能唤醒等待的线程。

优势与应用场景

条件变量的优势与应用场景

  • 优势: 允许线程在特定条件不满足时进入睡眠状态,节省CPU资源。
  • 应用场景: 生产者-消费者问题,线程池管理,资源分配等。

信号量的优势与应用场景

  • 优势: 可以控制多个线程或进程对有限资源的访问,防止资源竞争。
  • 应用场景: 限制同时访问某一资源的线程数量,实现互斥访问,同步多个进程的执行顺序。

示例代码

条件变量示例

代码语言:txt
复制
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int ready = 0;

void* producer(void* arg) {
    pthread_mutex_lock(&mutex);
    ready = 1;
    pthread_cond_signal(&cond);
    pthread_mutex_unlock(&mutex);
    return NULL;
}

void* consumer(void* arg) {
    pthread_mutex_lock(&mutex);
    while (!ready) {
        pthread_cond_wait(&cond, &mutex);
    }
    printf("Consumer: Data is ready!\n");
    pthread_mutex_unlock(&mutex);
    return NULL;
}

int main() {
    pthread_t producer_thread, consumer_thread;
    pthread_create(&producer_thread, NULL, producer, NULL);
    pthread_create(&consumer_thread, NULL, consumer, NULL);
    pthread_join(producer_thread, NULL);
    pthread_join(consumer_thread, NULL);
    return 0;
}

信号量示例

代码语言:txt
复制
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

sem_t sem;

void* thread_func(void* arg) {
    sem_wait(&sem);
    printf("Thread entered critical section.\n");
    // Critical section
    sem_post(&sem);
    return NULL;
}

int main() {
    sem_init(&sem, 0, 3); // Allow 3 threads in critical section at a time
    pthread_t threads[10];
    for (int i = 0; i < 10; ++i) {
        pthread_create(&threads[i], NULL, thread_func, NULL);
    }
    for (int i = 0; i < 10; ++i) {
        pthread_join(threads[i], NULL);
    }
    sem_destroy(&sem);
    return 0;
}

常见问题及解决方法

条件变量常见问题

  • 虚假唤醒: 线程在没有被显式唤醒的情况下醒来。解决方法是在循环中检查条件。
  • 死锁: 如果忘记解锁互斥锁,可能导致其他线程无法继续执行。确保每次调用pthread_cond_wait后都有对应的解锁和加锁操作。

信号量常见问题

  • 资源泄漏: 如果忘记调用sem_destroy,可能导致信号量资源未被正确释放。确保在程序结束前调用sem_destroy
  • 死锁: 如果信号量的初始值设置不当或使用逻辑错误,可能导致死锁。仔细设计信号量的初始值和使用逻辑。

通过上述基础概念、示例代码以及常见问题的解决方法,可以有效地使用条件变量和信号量进行多线程编程和进程同步。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券