gpt4 book ai didi

c - 在 C 中多线程时同步无法正常工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:49 24 4
gpt4 key购买 nike

我正在尝试创建一个简单的酒吧程序,其中酒吧内可以同时有一定数量的顾客。每次客户要啤酒时,调酒师都应该为客户提供啤酒。

由于某些原因,在我的程序中,酒保在顾客离开酒吧后为顾客服务

我该如何解决这个问题?有什么建议吗?

这是我的代码:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h> //for declaration of exit()
#include <semaphore.h> //to use semaphores

pthread_mutex_t serve = PTHREAD_MUTEX_INITIALIZER;
pthread_barrier_t barrier1;
sem_t OktoEnter;

int cid = 0;

void EnterBar();
void OrderStart();
void ServeStart();
void ServeDone();
void OrderDone();
void DrinkBeer();
void LeaveBar();

void* Bartender(void *arg)
{
ServeStart();
ServeDone();
}

void* Customer(void* id)
{
cid =(int)id;
EnterBar();
LeaveBar();

}

void EnterBar(){
printf("Customer %d enters the bar.\n", cid);
int cups;
pthread_t order;

for(cups=0;cups<(cid%3+1);cups++){
pthread_mutex_lock(&serve);
OrderStart();
OrderDone();
DrinkBeer();
pthread_mutex_unlock(&serve);
}
//decrease semaphore
}
void OrderStart(){
pthread_t order;
printf("Customer %d asks for beer.\n", cid);
int rc = pthread_create(&order, NULL, Bartender, NULL);

}
void OrderDone(){
printf("Customer %d gets the beer.\n", cid);

}
void DrinkBeer(){
printf("Customer %d drinks the beer.\n", cid);
}
void LeaveBar(){
printf("Customer %d leaves the bar.\n", cid);
//increase semaphore
}

void ServeStart(){
printf("Bartender starts to serve customer %d.\n", cid);
}

void ServeDone(){
printf("Bartender is done serving customer %d.\n", cid);
}

int main (int argc, char *argv[])
{
int t;
long rc;
int num_customers = atoi(argv[1]); //number of customers
int capacity = atoi(argv[2]); //bar capacity

if(num_customers > 0 && capacity > 0){
pthread_t threads[num_customers];
if(random() > RAND_MAX / 2)
usleep(1);
//rc = sem_init(&sem1,0,capacity);
rc = pthread_barrier_init(&barrier1, NULL, num_customers);
for(t=0; t< num_customers; t++){
printf("In main: creating thread %d\n", t);
rc = pthread_create(&threads[t], NULL, Customer, (void* )t);
if (rc){
printf("ERROR; return code from pthread_create() is %ld\n", rc);
exit(-1);
}
}
}
else{
printf("ERROR: Both parameters should be a valid positive numbers.");
exit(-1);
}

/* Last thing that main() should do */
pthread_exit(NULL);
}

我努力改变功能,但它不能正常工作。

最佳答案

老实说,您不清楚您最初是清楚地知道要从哪里开始,还是只是迷失在杂草丛中,您开始将东西往墙上扔,看看会粘住什么。对不起,混合的隐喻。

你有一堆小错误(例如,有时 cid 是一个参数,有时它是所有线程共享的一个全局参数)和一堆不必要的东西,我认为是实验中的碎屑。

我将它剥离为一个非常基本的线程程序,我将保留它,因为我真的不明白你到底想把它带到哪里。先让简单的东西起作用,然后再把复杂的东西分层。祝你好运。

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

void EnterBar();
void OrderStart();
void ServeStart();
void ServeDone();
void OrderDone();
void DrinkBeer();
void LeaveBar();

void Bartender(int cid)
{
ServeStart(cid);
ServeDone(cid);
}

void* Customer(void* id)
{
int cid = (int) id;

EnterBar(cid);
LeaveBar(cid);
}

void EnterBar(int cid)
{
printf("Customer %d enters the bar.\n", cid);
int cups;
pthread_t order;

OrderStart(cid);
OrderDone(cid);
DrinkBeer(cid);
}

void OrderStart(int cid)
{
printf("Customer %d asks for beer.\n", cid);
Bartender(cid);
}

void OrderDone(int cid)
{
printf("Customer %d gets the beer.\n", cid);
}

void DrinkBeer(int cid)
{
printf("Customer %d drinks the beer.\n", cid);
}

void LeaveBar(int cid)
{
printf("Customer %d leaves the bar.\n", cid);
}

void ServeStart(int cid)
{
printf("Bartender starts to serve customer %d.\n", cid);
}

void ServeDone(int cid)
{
printf("Bartender is done serving customer %d.\n", cid);
}

int main (int argc, char *argv[])
{
int t;
long rc;

if (argc < 3)
{
printf("use the parameters\n");
exit(1);
}

int num_customers = atoi(argv[1]); //number of customers
int capacity = atoi(argv[2]); //bar capacity

if (num_customers <= 0 || capacity <= 0)
{
printf("ERROR: Both parameters should be a valid positive numbers.");
exit(1);
}

pthread_t threads[num_customers];

for (t = 0; t < num_customers; t++)
{
printf("In main: creating thread %d\n", t);
rc = pthread_create(&threads[t], NULL, Customer, (void* )t);

if (rc)
{
printf("ERROR; return code from pthread_create() is %ld\n", rc);
exit(1);
}
}

for (t = 0; t < num_customers; t++)
pthread_join(threads[t], NULL);

pthread_exit(NULL);
}

关于c - 在 C 中多线程时同步无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11303131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com