Бесконечный цикл в моей программе потоков не работает, и вместо этого мои сообщения распечатываются n раз. Как я могу этLinux

Ответить Пред. темаСлед. тема
Гость
 Бесконечный цикл в моей программе потоков не работает, и вместо этого мои сообщения распечатываются n раз. Как я могу эт

Сообщение Гость »

Я хочу распечатать n потоков бесконечное количество раз, например:
Введите количество потоков: 4
Поток 1 имеет идентификатор потока_140282626569792, сообщение 1
Поток 2 имеет идентификатор потока_140282618177088, сообщение 1Поток 3 имеет идентификатор потока_140282609784384, сообщение 1
Поток 4 имеет идентификатор потока_140282601391680, сообщение 1
Поток 1 имеет идентификатор потока_140282626569792, сообщение 1
Поток 2 имеет идентификатор потока_140282618177088 , сообщение 1
Поток 3 имеет идентификатор потока_140282609784384, сообщение 1
Поток 4 имеет идентификатор потока_140282601391680, сообщение 1
Поток 1 имеет идентификатор потока_140282626569792, сообщение 1
Поток 2 имеет идентификатор потока_140282618177088, сообщение 1
Тема 3 имеет поток id_140282609784384, сообщение 1
В потоке 4 есть поток id_140282601391680, сообщение 1
..программа завершается, как только я нажимаю ctrl-c
Вместо этого мой вывод:
Поток 1 имеет идентификатор потока_140282626569792, сообщение 1
Поток 2 имеет идентификатор потока_140282618177088, сообщение 1
Поток 3 имеет идентификатор потока_140282609784384, сообщение 1
Поток 4 имеет идентификатор потока_140282601391680 , сообщение 1
Вот мой код:

Код: Выделить всё

#include 
#include 
#include
#include 
#define MAX_THREADS 100

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // Mutex declaration
pthread_cond_t cond_var = PTHREAD_COND_INITIALIZER; // Condition variable initialization

int message_counter[MAX_THREADS] = {0}; // Counter for message printing
int thread_count = 0; // Global thread count

void *printMessage(void *arg) {
long tid = (long)arg;
int num_threads;

pthread_mutex_lock(&mutex);
while(1) {
while (tid != thread_count) {

pthread_cond_wait(&cond_var, &mutex);
}

printf("Thread %ld has thread id_%ld, message %d\n", tid + 1, pthread_self(), message_counter[tid] + 1);
for ( int i=0; i< num_threads; i++) {
message_counter[tid]++;
}
thread_count = (thread_count + 1) % MAX_THREADS;
pthread_cond_broadcast(&cond_var); // Signal all threads that the message has been printed
pthread_mutex_unlock(&mutex);

}

pthread_exit(NULL);
}

int main() {
pthread_t threads[MAX_THREADS];
int rc;
long t;

int num_threads;
printf("Enter number of threads: ");
scanf("%d", &num_threads);

if (num_threads > MAX_THREADS) {
printf("Maximum number of threads exceeded.\n");
return 1;
}
while(1) {
for (t = 0; t < num_threads; t++) {
rc = pthread_create(&threads[t], NULL, printMessage, (void *)t);
}
if (rc) {
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}

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

pthread_exit(NULL);
}

Я пробовал сделать цикл while(1) в основной программе перед созданием потоков, но все равно не работает так, как я хочу.


Подробнее здесь: https://stackoverflow.com/questions/781 ... re-printed
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»