线程退出多线程场景中的差异

时间:2016-02-17 05:29:52

标签: c multithreading pthreads printf

我写了一个非常简单的练习信号量的代码。任务是销售门票,每个线程应更新总票数的共享变量,直到它变为零。我正在观察的问题是 - 销售最后一张票的线程,并通过递减它使ticket_count = 0退出而不打印它销售的票总数。当我在SO上阅读关于多线程环境中的printf问题时,我在printf中添加了mutex只是为了破解它。原因我发现这个问题不同于普通的关于多线程的SO的正常printf问题是 - 它始终(不总是8/10次 - 问题是间歇性的 - 其他2次打印所有4个线程售票)最后一个线程即销售最后一张票的那个人会跳过printf并退出。有人能指出我做错了什么吗?

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <stdbool.h>
#include <unistd.h>

#define NUMTHREADS  4       /* number of threads i.e. ticket sellers */

static unsigned int ticket_count = 25;

pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;

sem_t mutex;

void *ticketProcessing(void *arg)
{
    bool loop_alive = true;
    int local_counter = 0;
    while(loop_alive)
    {
        sleep(1);
        sem_wait(&mutex);
        if (ticket_count > 0)
        {
            local_counter++;
            ticket_count--;
            printf(" thread id -- %d - decided to sell 1 ticket \n ", (int)pthread_self());
        }
        else
        {
            loop_alive = false;
        }
        sem_post(&mutex);
    }

    pthread_mutex_lock(&mutex2);
    printf(" ticket sold by thread id -- %d -- is  %d \n ", (int)pthread_self(), local_counter);
    pthread_mutex_unlock(&mutex2);
  //  return 0;
}

int main(void)
{
    pthread_t sellingTicket;
    sem_init(&mutex, 0, 1);
    int i;

    for(i = 0; i < NUMTHREADS; i++)
    {
        pthread_create(&sellingTicket, NULL, ticketProcessing, NULL);
    }

    i = 0;
    while(i < NUMTHREADS)
    {
        pthread_join(sellingTicket, NULL);
        i++;
    }


    printf(" All threads exited !!! \n ");
    return 0;
}

编辑:我尝试以下面的方式创建数组并加入

 pthread_t threads[4];

 for(i = 0; i < 4; i++)
 {
     pthread_create(&threads[i], NULL, ticketProcessing, NULL);
 }

for(i = 0; i < 4; i++)
{
    pthread_join(threads[i], NULL);
}

1 个答案:

答案 0 :(得分:3)

您的join循环尝试反复加入最后一个线程,而不是尝试加入已创建的每个线程。您需要跟踪线程ID,以便您可以将它们全部加入。

一旦你加入了一个线程,线程ID就无效了,将它传递给任何pthread_ *函数是一个严重的错误。