64,639
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
pthread_cond_t tcon;
pthread_mutex_t tmut;
int i=0;
void* produce(void* arg)
{
int j=0;
for(j=0;j<10;j++)
{
pthread_mutex_lock(&tmut);
printf("producer begins work\n");
i++;
printf("in producer, i is %d\n",i);
pthread_mutex_unlock(&tmut);
pthread_cond_signal(&tcon);
sleep(1);
}
}
void* consume(void* arg)
{
printf("consumer thread is start\n");
int j=0;
for(j=0;j<5;j++)
{
pthread_cond_wait(&tcon,&tmut);
pthread_mutex_lock(&tmut);
printf("consumer begins work\n");
i--;
printf("in consumer, i is %d\n",i);
pthread_mutex_unlock(&tmut);
}
}
int main(int agc, char* argv[])
{
pthread_cond_init(&tcon,NULL);
pthread_mutex_init(&tmut,NULL);
pthread_cond_signal(&tcon);
pthread_t t1,t2,t3;
pthread_create(&t1,NULL,produce,NULL);
pthread_create(&t2,NULL,consume,NULL);
pthread_create(&t3,NULL,consume,NULL);
sleep(20);
printf("in main(), i is %d\n",i);
pthread_cond_destroy(&tcon);
pthread_mutex_destroy(&tmut);
}
#include <condition_variable>
#include <mutex>
#include <thread>
using namespace std;
mutex m;
condition_variable cv;
int cake_count = 0;
atomic<int> consumer_index = 0;
void produce()
{
for (int i = 0; i < 10; i++)
{
{
lock_guard<mutex> guard(m);
printf("producer begins work \n");
++cake_count;
}
cv.notify_one();
this_thread::sleep_for(50ms);
}
}
void consume()
{
int index = ++consumer_index;
printf("consumer thread %d begins \n", index);
for (int i = 0; i < 5; i++)
{
unique_lock<mutex> locker(m);
cv.wait(locker, []() {return cake_count > 0; });
printf("consumer %d begins work \n", index);
--cake_count;
printf("consumer %d ends work \n", index);
this_thread::sleep_for(10ms);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
thread consumer1(consume);
thread consumer2(consume);
thread producer(produce);
producer.join();
consumer1.join();
consumer2.join();
}