【发布时间】:2026-02-06 08:15:02
【问题描述】:
我试图看到竞争条件发生在消费者-生产者问题中, 所以我做了多个生产者和多个消费者。
据我所知,我需要为互斥量提供信号量: 竞争条件的互斥锁,因为多个生产者可以同时访问缓冲区。那么数据可能已损坏。
和信号量在生产者和消费者之间提供信号
这里的问题是当我不使用互斥锁时同步正确发生(我只使用信号量)。我的理解是正确的还是下面的代码有什么问题:
#include <pthread.h>
#include <stdio.h>
#include <semaphore.h>
#include <stdlib.h>
#include <unistd.h>
int buffer;
int loops = 0;
sem_t empty;
sem_t full;
sem_t mutex; //Adding MUTEX
void put(int value) {
buffer = value;
}
int get() {
int b = buffer;
return b;
}
void *producer(void *arg) {
int i;
for (i = 0; i < loops; i++) {
sem_wait(&empty);
//sem_wait(&mutex);
put(i);
//printf("Data Set from %s, Data=%d\n", (char*) arg, i);
//sem_post(&mutex);
sem_post(&full);
}
}
void *consumer(void *arg) {
int i;
for (i = 0; i < loops; i++) {
sem_wait(&full);
//sem_wait(&mutex);
int b = get();
//printf("Data recieved from %s, %d\n", (char*) arg, b);
printf("%d\n", b);
//sem_post(&mutex);
sem_post(&empty);
}
}
int main(int argc, char *argv[])
{
if(argc < 2 ){
printf("Needs 2nd arg for loop count variable.\n");
return 1;
}
loops = atoi(argv[1]);
sem_init(&empty, 0, 1);
sem_init(&full, 0, 0);
sem_init(&mutex, 0, 1);
pthread_t pThreads[3];
pthread_t cThreads[3];
pthread_create(&cThreads[0], 0, consumer, (void*)"Consumer1");
pthread_create(&cThreads[1], 0, consumer, (void*)"Consumer2");
pthread_create(&cThreads[2], 0, consumer, (void*)"Consumer3");
//Passing the name of the thread as paramter, Ignore attr
pthread_create(&pThreads[0], 0, producer, (void*)"Producer1");
pthread_create(&pThreads[1], 0, producer, (void*)"Producer2");
pthread_create(&pThreads[2], 0, producer, (void*)"Producer3");
pthread_join(pThreads[0], NULL);
pthread_join(pThreads[1], NULL);
pthread_join(pThreads[2], NULL);
pthread_join(cThreads[0], NULL);
pthread_join(cThreads[1], NULL);
pthread_join(cThreads[2], NULL);
return 0;
}
【问题讨论】:
-
到底是什么问题? “同步”是什么意思?
-
我的意思是;我预计生产者之间会在“缓冲区”上发生竞争条件,因为我没有提供互斥锁。我只使用信号量。但是上面的代码可以正常工作,没有问题(竞争条件)如果我放置多个生产者而不是只放置一个生产者,我想实际测试的是,竞争条件是否会发生(没有提供互斥锁,只有两个信号量)?