当前位置:首页 > 系统教程 > 正文

Linux多线程同步详解

Linux多线程同步详解

生产者消费者模型实战教程

在Linux系统编程中,Linux多线程是一项核心技能,而线程同步则是保证多线程程序正确运行的关键。本文将以经典的生产者消费者模型为例,手把手带你掌握同步机制,包括互斥锁、条件变量等概念,即使是小白也能轻松入门。

为什么需要线程同步?

当多个线程同时访问共享资源(如全局变量)时,如果不加以控制,就会导致数据不一致。例如,两个线程同时修改同一个变量,可能产生竞态条件。因此,我们必须使用同步机制来协调线程的执行顺序。

常用同步工具

  • 互斥锁:保护临界区,确保同一时间只有一个线程访问共享资源。
  • 条件变量:允许线程在某个条件不满足时等待,并在条件满足时被唤醒,常与互斥锁配合使用。
  • 信号量:一种计数器,用于控制同时访问资源的线程数量。

生产者消费者模型

生产者消费者模型是线程同步的经典场景:生产者线程生成数据放入缓冲区,消费者线程从缓冲区取走数据。当缓冲区满时,生产者必须等待;当缓冲区空时,消费者必须等待。这正好可以用条件变量和互斥锁来实现。

Linux多线程同步详解 Linux多线程 线程同步 生产者消费者模型 互斥锁 第1张

代码示例(C语言 + pthread)

    #include #include #define BUFFER_SIZE 5int buffer[BUFFER_SIZE];int count = 0; // 当前产品数量pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond_producer = PTHREAD_COND_INITIALIZER;pthread_cond_t cond_consumer = PTHREAD_COND_INITIALIZER;void* producer(void* arg) {    for (int i = 0; i < 10; i++) {        pthread_mutex_lock(&mutex);        while (count == BUFFER_SIZE) {            pthread_cond_wait(&cond_producer, &mutex);        }        buffer[count++] = i;        printf("生产: %d", i);        pthread_cond_signal(&cond_consumer);        pthread_mutex_unlock(&mutex);    }    return NULL;}void* consumer(void* arg) {    for (int i = 0; i < 10; i++) {        pthread_mutex_lock(&mutex);        while (count == 0) {            pthread_cond_wait(&cond_consumer, &mutex);        }        int item = buffer[--count];        printf("消费: %d", item);        pthread_cond_signal(&cond_producer);        pthread_mutex_unlock(&mutex);    }    return NULL;}int main() {    pthread_t prod, cons;    pthread_create(&prod, NULL, producer, NULL);    pthread_create(&cons, NULL, consumer, NULL);    pthread_join(prod, NULL);    pthread_join(cons, NULL);    return 0;}  

以上代码中,互斥锁保证了对count和缓冲区的互斥访问,条件变量则让生产者在缓冲区满时等待,消费者在缓冲区空时等待。当生产者生产一个产品后,会唤醒消费者;消费者消费后唤醒生产者。这样就完美解决了同步问题。

总结

通过本文,我们学习了Linux多线程中的线程同步机制,并利用互斥锁和条件变量实现了生产者消费者模型。理解这些基础后,你可以进一步探索信号量、读写锁等高级同步工具,编写更复杂的多线程程序。希望这篇教程对你有所帮助!