我的问题是,使用一个线程,一切正常,但是如果我使用多个线程,程序将无法正常工作。 如果我使用多个线程,我必须使用一个互斥锁或一个互斥锁数组?我尝试使用互斥数组,但它不起作用。
#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 # %ldn",i);
printf("Choose the seat that you wantn");
scanf("%d",&n);
if(v_seat[n-1]==0){
v_seat[n-1]=1;
printf("Seat available.Booking done by thread %ldn",i);
terminal_screen(v_seat);
count++;
}
else{
printf("Seat not availablenRiprovann");
}
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("Errorn");
}
}
for(i=0;i<NUM_SEATS;i++){
pthread_join(tid[i],NULL);
}
};
printf("nnAll seats are occupied..n");
pthread_exit(NULL);
}
int terminal_screen(int v[]){
int i;
printf("These are the free seatsn");
for(i=0;i<NUM_SEATS;i++){
if(v[i]==0)
printf("tSeat %dn",i+1);
}
}
这是我的多线程问题。
通过通信链路连接到远程终端的中央计算机用于自动预订音乐厅的座位。 预订员可以在 终端屏幕。要预订座位,客户选择一个免费座位,店员在航站楼输入所选座位的号码并开票。需要一个系统,避免重复预订同一座位,同时允许客户自由选择可用座位。
您必须在 C 语言程序中使用线程或进程设计和实现 系统,以便您的模型不允许重复预订。
您的终端流程应允许客户选择座位,此时流程 应查询以确定是否保留了座位。 如果未预订座位,则应预订座位,否则没有任何变化。
您应该修复四个警告(激活编译器的警告)。
除此之外,该程序还可以工作。
您希望所有座位使用一个互斥锁还是每个席位一个互斥锁取决于场景(剧院席位只是其中一种情况)。如果您决定每个席位互斥锁,那么您将在检查席位的环路内锁定和解锁互斥锁。
还要注意您生成的线程数:每个席位生成一个线程是不寻常的(即使我们考虑了座位以外的其他场景)。例如,可以选择线程数作为目标计算机具有的 CPU 内核数。
编写"我是线程 #n"的线程不一定是scanf
的线程是接收用户输入的线程:调度程序可以在printf
和scanf
之间切换线程。这也可以通过在printf-scanf组合周围安装互斥锁来解决。
从控制台读取不是线程/锁定是否正确的现实测试。更现实的测试是运行每秒保留/释放席位数百万次的线程(用于测试目的,使用随机数选择要保留的席位)。