M次执行后在C中完成多线程程序?

时间:2016-05-19 05:00:16

标签: c multithreading synchronization producer-consumer

所以,我知道你们喜欢详细介绍,我保证会提供更多与他们真正相关的内容,但对于我的情况,你应该记住以下内容:

  1. 我有P个线程是生产者
  2. 我有C线程是消费者
  3. 我有N个元素的缓冲区
  4. 我想在消耗M个元素之后完成该程序。
  5. 我该怎么做?

    下面是我的主要功能

    int main(int argc, char *argv[]) {
        int i;
        /* Verify the correct number of arguments were passed in */
        if(argc != 4) {
            fprintf(stderr, "USAGE:./main.out <INT> <INT> <INT>\n");
        }
        int mainSleepTime = atoi(argv[1]); /* Time in seconds for main to sleep */
        int numProd = atoi(argv[2]); /* Number of producer threads */int numCons = atoi(argv[3]); /* Number of consumer threads */
        /* Initialize the app */
        initializeData();
        /* Create the producer threads */
        for(i = 0; i < numProd; i++) {
            /* Create the thread */
            pthread_create(&tid,&attr,producer,NULL);
        }
        /* Create the consumer threads */
        for(i = 0; i < numCons; i++) {
            /* Create the thread */
            pthread_create(&tid,&attr,consumer,NULL);
        }
        /* Sleep for the specified amount of time in milliseconds */
        /* Exit the program */
        sleep(mainSleepTime);
        printf("Exit the program\n");
        exit(0);
    }
    

    现在程序在睡眠时间计算。但是,如果我改变N,我想测量执行M次执行所需的不同时间.InitializeData只是一个处理缓冲区的函数。我相信这个技巧应该在主要方面解决。有人能帮助我吗?

2 个答案:

答案 0 :(得分:1)

请参阅以下示例:

struct 
{
    int nProducednProduced;
    pthread_mutex_t producerMutex;
    int nConsumed;
    pthread_mutex_t consuerMutex;
} monitor;

monitor是一个全局对象,可以从所有线程中看到,并在创建线程之前由main()初始化。

生产者应该增加monitor.nProduced并在达到M时停止/退出。

消费者增加monitor.nConsumed并在到达M时停止/退出。

main()监控monitor.nConsumed并在达到M 时退出,只需等待所有生产者和消费者完成。

答案 1 :(得分:0)

只需编写一个可由生产者和消费者访问的全局函数,并使用互斥锁保护此函数的入口和出口点,以便安全地保护此关键部分免受多个同时访问。现在,在此函数中,您可以使用计数器来检查生产者生成的项目数以及使用者消耗的项目数。如果您在生产者生产项目之前的某个点从生产者代码调用此函数,则会发生这种情况。同样,您可以在消费者使用项目后调用此函数。