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(¬_full, &mutex);
}
buffer[in] = i;
in = (in + 1) % BUFFER_SIZE;
count++;
printf("Produced: %d (count=%d)\n", i, count);
pthread_cond_signal(¬_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(¬_empty, &mutex);
}
int item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
count--;
printf("Consumed: %d (count=%d)\n", item, count);
pthread_cond_signal(¬_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(¬_full);
pthread_cond_destroy(¬_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为总生产量即可。