C,Pthreads - 如何重新执行指定的函数或start_routine

时间:2014-11-25 07:45:41

标签: c multithreading pthreads

我是C编程的新手,我正在学习它。给我的任务如下:

  1. 创建一个运算符(一个运算符作为一个线程)
  2. 最初创建10个零售商(每个一个帖子)
  3. 最初创建10个客户(每个一个线程)
  4. 以后的任务需要之前创建的线程。 还有更多的任务,例如零售商通过运营商与客户沟通,但这不是我要问的问题

    这是我的一些代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    
    #define NUM_THREAD 21
    
    
    void* operator (void* arg) {
         //Logic here
    }
    
    void* retailer(void *arg) {
        //Logic here
    }
    
    void* customer(void* arg) {
       //Logic here
    }
    
    main() {
        pthread_t threads[NUM_THREAD];
    
        int i = 0;
        pthread_create(&threads[0],NULL , operator , NULL);
        printf("Operator created.\n");
    
        for ( i = 1 ; i < 11 ; i++) {
            pthread_create(&threads[i], NULL , retailers ,NULL);
    
        }
    
        for (i = 11 ; i < NUM_THREAD ; i++) {
            pthread_create(&threads[i], NULL , customers , NULL);
    
        }
    
    }
    

    预期输出

    Operator created.
    Retailer 1 Created.
    ...
    Retailer 10 Created.
    Customer 1 Created.
    ...
    Customer 10 Created.
    ..The rest of output are the action between Operator , retailers and customers which involves semaphores and other stuff
    

    我在互联网上搜索过,我对如何在创建后“重用”线程没有任何想法。当我创建一个线程时,它应该开始执行pthread_create中指定的函数。但是,在执行该函数之后,它只是失去了任务1,2,3的含义,因为任务3之后的任务需要这些线程。

    要明确,这是我的问题

    1. 如何创建一个线程并使其保持活动状态,以便我以后可以重用该功能?
    2. 在线程的start_routine中放入if ... else是一个好方法吗?

1 个答案:

答案 0 :(得分:1)

在回答你的第一个问题时,线程函数通常包括启动代码,一些描述的长时间循环和终止代码,如下面的伪代码,粗略说明:

def retailer:
    initialise thread-local stuff
    while termination condition not met:
        do some processing
    terminate thread-local stuff

所以一个线程将继续运行,直到某段代码(例如CTRL-C信号处理程序,或用户告诉它停止时的主线程)指示它应该停止。

请注意,在线程之间共享保护资源的正确使用(例如检查终止条件和“执行某些处理”中涉及的任何线程间通信)是上述代码中固有的,我没有明确地 提到了它,但应该这样做。

对于你的第二个问题,你几乎可以在线程函数中放入你想要的任何代码,就像它是一个普通的单线程代码一样。

线程介绍了您通常不必关注的某些方面,例如竞争条件,线程本地存储或线程同步(互斥,条件变量等),但您可以使用正常的C控制流<{1}}和if等内容无关紧要。