我写了一个非常简单的练习信号量的代码。任务是销售门票,每个线程应更新总票数的共享变量,直到它变为零。我正在观察的问题是 - 销售最后一张票的线程,并通过递减它使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);
}
答案 0 :(得分:3)
您的join循环尝试反复加入最后一个线程,而不是尝试加入已创建的每个线程。您需要跟踪线程ID,以便您可以将它们全部加入。
一旦你加入了一个线程,线程ID就无效了,将它传递给任何pthread_ *函数是一个严重的错误。