3. QNX线程同步与互斥

任务目标

在QNX环境下实现一个多线程生产者-消费者程序,使用pthread_mutex保护共享缓冲区,使用pthread_cond实现生产与消费之间的等待/通知机制,解决经典同步问题。

核心实现

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

#define BUFFER_SIZE 5
#define ITEM_COUNT  10

static int buffer[BUFFER_SIZE];
static int count = 0;
static int in = 0, out = 0;

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t  not_full  = PTHREAD_COND_INITIALIZER;
static pthread_cond_t  not_empty = PTHREAD_COND_INITIALIZER;

static void* producer(void* arg) {
    (void)arg;
    for (int i = 0; i < ITEM_COUNT; i++) {
        pthread_mutex_lock(&mutex);
        while (count == BUFFER_SIZE) {
            pthread_cond_wait(&not_full, &mutex);
        }
        buffer[in] = i;
        in = (in + 1) % BUFFER_SIZE;
        count++;
        printf("Produced: %d (count=%d)\n", i, count);
        pthread_cond_signal(&not_empty);
        pthread_mutex_unlock(&mutex);
    }
    return NULL;
}

static void* consumer(void* arg) {
    (void)arg;
    for (int i = 0; i < ITEM_COUNT; i++) {
        pthread_mutex_lock(&mutex);
        while (count == 0) {
            pthread_cond_wait(&not_empty, &mutex);
        }
        int item = buffer[out];
        out = (out + 1) % BUFFER_SIZE;
        count--;
        printf("Consumed: %d (count=%d)\n", item, count);
        pthread_cond_signal(&not_full);
        pthread_mutex_unlock(&mutex);
    }
    return NULL;
}

int main(void) {
    pthread_t tid_producer, tid_consumer;

    pthread_create(&tid_producer, NULL, producer, NULL);
    pthread_create(&tid_consumer, NULL, consumer, NULL);

    pthread_join(tid_producer, NULL);
    pthread_join(tid_consumer, NULL);

    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&not_full);
    pthread_cond_destroy(&not_empty);

    printf("All done. Final count = %d\n", count);
    return 0;
}

编译与运行

qcc -o pc_demo pc_demo.c -lpthread
./pc_demo

验证方法

  • 程序正常退出,无死锁或崩溃。
  • 输出中count值始终在0~5之间,不会超过缓冲区容量。
  • 最终打印Final count = 0,表示所有生产项均被消费。
  • 生产总数与消费总数均为10,且每个生产值恰好被消费一次。

关键说明

  • while循环而非if检查条件,防止虚假唤醒。
  • 条件变量必须与互斥锁配合使用,pthread_cond_wait原子地释放锁并阻塞,唤醒后重新获取锁。
  • 本例中生产者和消费者各一个线程;若需多实例,只需创建多个线程并调整ITEM_COUNT为总生产量即可。
共享缓冲区 (size=5) 0 1 2 3 4 生产者线程 pthread_create 消费者线程 pthread_create 写入 读取 pthread_mutex_lock / unlock not_full / not_empty 条件变量 缓冲区满→等待not_full 缓冲区空→等待not_empty