[英]thread exit discrepency in multi-thread scenario
我已经编写了一个非常简单的代码来练习信号量。 任务是出售票证,每个线程应更新票证总数的共享变量,直到变为零为止。 我观察到的问题是-售出最后一张票并通过减少其退出而使ticket_count = 0的线程而不打印其售出的总票数。 我在printf周围添加了互斥锁只是为了破解它,因为我了解了SO上多线程环境中的printf问题。 我发现此问题与针对多线程的普通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);
}
您的join循环尝试一遍又一遍地加入最后一个线程,而不是尝试加入所创建的每个线程。 您需要跟踪线程ID,以便可以将它们全部加入。
加入线程后,线程ID无效,将其传递给任何pthread_ *函数是一个严重的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.