我的问题是,使用一个线程一切正常,但如果我使用多个线程,程序就无法正常工作。 如果我使用多个线程,我必须使用一个互斥锁或一个互斥锁数组?我曾尝试使用互斥阵列,但它不起作用。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#define NUM_SEATS 10 //0 free seat //1 seat not free
//pthread_mutex_t mu[NUM_SEATS];
pthread_mutex_t mu=PTHREAD_MUTEX_INITIALIZER;
int v_seat[NUM_SEATS]={0}; int count=0;
int terminal_screen(int v[]);
void *booking(void *arg){
long int *ip,i;
ip=(long int*)arg;
i=*ip;
//printf("%d",i);
int n;
pthread_mutex_lock(&mu);
printf("I'm thread # %ld\n",i);
printf("Choose the seat that you want\n");
scanf("%d",&n);
if(v_seat[n-1]==0){
v_seat[n-1]=1;
printf("Seat available.Booking done by thread %ld\n",i);
terminal_screen(v_seat);
count++;
}
else{
printf("Seat not available\nRiprova\n\n");
}
pthread_mutex_unlock(&mu);
pthread_exit(NULL); }
int main(int argc, char *argv[]){
int rc,i;
/*pthread_t tid,tid2;
long int a=1;
long int b=2;*/
pthread_t tid[NUM_SEATS];
pthread_t ta[NUM_SEATS];
/* for(i=0;i<NUM_SEATS;i++){
pthread_mutex_init(&mu[i],NULL);
}*/
terminal_screen(v_seat);
while(count!=NUM_SEATS){
/*pthread_create(&tid,NULL,booking,(void*)&a);
pthread_create(&tid2,NULL,booking,(void*)&b);
pthread_join(tid,NULL);
pthread_join(tid2,NULL);*/
for(i=0;i<NUM_SEATS;i++){
ta[i]=i;
if(rc=pthread_create(&tid[i],NULL,booking,(void*)&ta[i])){
printf("Error\n");
}
}
for(i=0;i<NUM_SEATS;i++){
pthread_join(tid[i],NULL);
}
};
printf("\n\nAll seats are occupied..\n");
pthread_exit(NULL);
}
int terminal_screen(int v[]){
int i;
printf("These are the free seats\n");
for(i=0;i<NUM_SEATS;i++){
if(v[i]==0)
printf("\tSeat %d\n",i+1);
}
}
这是我的多线程问题。
通过通信链路连接到远程终端的中央计算机用于自动化音乐厅的座位预订。预订员可以在上面显示预订的当前状态 终端屏幕。为了预订座位,客户选择免费座位,并且职员在终端输入所选座位的号码并发出票。需要一个系统,避免对同一座位进行双重预订,同时允许客户自由选择可用的座位 你必须在C语言程序中设计和实现线程或进程的模型 系统,以便您的模型不允许双重预订 您的TERMINAL流程应该允许客户选择一个座位,此时该流程 应查询以确定座位是否被保留。如果座位没有预订,则应该预订,否则不会有任何变化。
答案 0 :(得分:2)
您应该修复四个警告(激活编译器的警告)。
除此之外,该计划也有效。
是否需要所有座位的单个互斥锁或每个座位的互斥锁取决于场景(影院座位只是一个这样的场景)。如果您决定使用每个席位的互斥锁,那么您可以锁定和解锁内部的互联网检查座位的循环。
还要注意你产生的线程数:每个座位产生一个线程是不常见的(即使我们考虑其他场景而不是座位)。例如,可以选择线程数作为目标计算机具有的CPU核心数。
编写“我是线程#n”的线程不一定是scanf
是接收用户输入的线程:调度程序可以在printf
之间切换线程和scanf
。这可以通过在printf-scanf组合周围使用互斥锁来解决。
从控制台读取对于线程/锁定是否正确不是一个真实的测试。更现实的测试是运行每秒保留/释放座位数百万次的线程(用于测试目的,使用随机数来选择要保留的座位)。