c - 我怎样才能让多个线程同时工作?

标签 c multithreading multiprocessing

我的问题是,使用一个线程一切工作正常,但如果我使用多个线程,程序就无法正常工作。 如果我使用多个线程,我必须使用一个互斥体或一组互斥体?我尝试使用互斥体数组,但它不起作用。

#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 语言程序中使用线程或进程来设计和实现以下模型: 系统,以便您的模型不允许重复预订。
您的终端流程应允许客户选择座位,此时流程 应查询以确定座位是否已预订。如果座位未预订,则应预订,否则不会发生任何变化。

最佳答案

您应该修复四个警告(激活编译器的警告)。

除此之外,该程序还可以运行。

是否需要为所有座位使用一个互斥锁或为每个座位使用一个互斥锁取决于具体情况(剧院座位只是其中一种情况)。如果您决定每个席位互斥锁,那么您将在检查席位的循环内锁定和解锁互斥锁。

另请注意您生成的线程数量:每个席位生成一个线程的情况并不常见(即使我们考虑席位以外的其他场景)。例如,线程数可以选择为目标计算机具有的 CPU 核心数。

并且写出“我是线程#n”的线程不一定是 scanf 的线程。是接收用户输入的线程:调度程序可以在 printf 之间切换线程。和scanf 。这也可以通过在 printf-scanf 组合周围设置互斥体来解决。

从控制台读取数据并不能真实地测试线程/锁定是否正确。更实际的测试是运行每秒数百万次保留/释放席位的线程(出于测试目的,使用随机数来选择要保留的席位)。

关于c - 我怎样才能让多个线程同时工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48582391/

相关文章:

c - malloc 在不同的机器上表现不同

c++ - 这些是空指针,还是指向地址 0 的指针?

python - 如何使用带有 *args 的映射在 python 函数调用中解包元组

c++ - 深入研究 C++ 中的多线程编程时, "things to know"是什么

python - 在Python中的实例方法上调用多处理池

python - 多处理和全局 True/False 变量

c - 用 C 编写一个名为reverse_str 的函数,该函数采用单个 char * 参数并就地反转字符串

c - 不使用双指针交换字符串

java - 在 Java 中是否有更简单的方法来知道被拒绝的任务(由执行器)是否已作为 "CallerRunsPolicy"运行?

c++ - 在线程中创建 COM 对象