Я написал очень простой код для практики семафора. Задача состоит в том, чтобы продавать билеты, и каждый поток должен обновлять общую переменную от общего количества билетов до тех пор, пока она не станет нулевой. Проблема, которую я наблюдаю, - это нить, которая продает последний билет и делает ticket_count = 0, уменьшая его выход, не печатая, сколько всего проданных билетов. Я добавил mutex вокруг printf только для его взлома, поскольку я читал о проблемах printf в многопоточной среде на SO. Причина. Я нахожу, что эта проблема отличается от обычных проблем с printf, указанных в SO в отношении многопоточности, - это всегда (не всегда 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;
}
Edit: я попытался создать массив и присоединиться ниже моды, и она работает
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);
}
Ошибка синхронизации основного вашего потока. Поэтому он не ждет должным образом всех потоков для выхода до выхода из основного потока (который также останавливает все дочерние потоки). 'pthread_join (sellingTicket, NULL)'. Это ожидает * тот же самый поток в каждом цикле - последний поток, который нужно создать. Для каждого дочернего потока вам понадобится * отдельная переменная 'sellingTicket' pthread_t *. – kaylum
@kaylum - я вижу, что вы делаете, но не можете реализовать - pthread_join, чтобы он ловил весь созданный поток, не могли бы вы привести пример в моем сценарии? Как я создал темы – thedreamer