如何让5个线程并发读写数组



我正在尝试在c++中解决著名的生产者-消费者问题,我已经提出了这样的实现…

#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <ctime>
void *consumeThread(void *i);
void *produceThread(void *i);
using std::cout;
using std::endl;
//Bucket size
#define Bucket_size 10
int buckets[Bucket_size];
pthread_mutex_t lock;
pthread_cond_t consume_now, produce_now;
time_t timer;
int o = 0;
int p = 0;
int main()
{
int i[5] = {1, 2, 3, 4, 5};
pthread_t consumer[5];
pthread_t producer[5];
pthread_mutex_init(&lock, nullptr);
pthread_cond_init(&consume_now, nullptr);
pthread_cond_init(&produce_now, nullptr);
timer = time(nullptr) + 10;
srand(time(nullptr));
for (int x = 0; x < 5; x++)
{
pthread_create(&producer[x], nullptr, &produceThread, &i[x]);
}
for (int x = 0; x < 5; x++)
{
pthread_create(&consumer[x], nullptr, &consumeThread, &i[x]);
}
pthread_cond_signal(&produce_now);
for (int x = 0; x < 5; x++)
{
pthread_join(producer[x], nullptr);
pthread_join(consumer[x], nullptr);
}
pthread_mutex_destroy(&lock);
pthread_cond_destroy(&consume_now);
pthread_cond_destroy(&produce_now);
return 0;
}
void *consumeThread(void *i)
{
bool quit = false;
while (!quit)
{
pthread_mutex_lock(&lock);
pthread_cond_wait(&consume_now, &lock);
printf("thread %d consuming element at array[%d] : the element is %d n", *((int *)i), o, buckets[o]);
buckets[o] = 0;
p++;
printArray();
usleep(100000);
pthread_cond_signal(&produce_now);
pthread_mutex_unlock(&lock);
quit = time(nullptr) > timer;
}
return EXIT_SUCCESS;
}
void *produceThread(void *i)
{
int a = 0;
bool quit = false;
while (!quit)
{
o = p % 10;
buckets[o] = (rand() % 20) + 1;
printf("thread %d adding element in array[%d] : the element is %d n", *((int *)i), o, buckets[o]);
a++;
printArray();
usleep(100000);
quit = time(nullptr) > timer;
}
return EXIT_SUCCESS;
}

目前这个解决方案有5个生产者线程和5个消费者线程,但是它只让1个线程生产和1个线程消费的时间,有没有办法使5个生产者和消费者线程并发工作?


线程1在数组[0]中添加元素:元素为6
[6,0,0,0,0,0,0,0,0]

您的第一个问题是您将条件变量视为具有内存。在main()中,您可以pthread_cond_signal(),但是此时,您不知道是否有任何线程正在等待该条件。由于条件变量没有内存,您的信号很可能会丢失。

第二个问题是o受到条件的有效保护;因为每个消费者都在使用它;当每个生产者修改它时,你不能允许多个生产者或消费者并发执行。

你想要的解决方案相当于一个队列,你从生产者那里注入0s;收集消费者的信息。这样,您的并发性是由生成的能力来决定的。

相关内容

  • 没有找到相关文章

最新更新