Я пишу различные фрагменты кода и посмотрю, что произойдет. Приведенный ниже код был предназначен для того, чтобы задержать все потоки, пока все не достигнут определенной точки в коде, а затем сделать каждую печать отличительным числом. Поскольку все потоки делают это, числа должны появляться в случайном порядке.
Моя текущая проблема состоит в том, что я заставляю их потоки заняты в ожидании. Если количество потоков становится большим, программа значительно замедляется.
Я хотел бы изменить это, используя сигналы, я нашел для этого pthread_cond_wait()
, однако я не вижу, как можно использовать это, чтобы сигнализировать всем потокам, что они проснутся.
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#define threads 10
int counter=0;
pthread_mutex_t lock;
void handler(void *v) {
pthread_mutex_lock(&lock);
counter++;
printf("%d\n", counter);
pthread_mutex_unlock(&lock);
while(counter != threads); // busy waiting
printf("I am first! %d\n", v);
}
int main() {
pthread_t t[threads];
for(int i =0; i < threads; i++) {
pthread_create(&t[i], NULL, handler, (void*) i);
}
for(int i =0; i < threads; i++) {
pthread_join(t[i], NULL);
}
return 0;
}
РЕДАКТИРОВАТЬ: я изменил код на следующее, однако, он по-прежнему не работает: /
pthread_mutex_t lock;
pthread_cond_t cv;
void handler(void *v) {
pthread_mutex_lock(&lock);
pthread_cond_wait(&cv, &lock);
printf("I am first! %d\n", v);
pthread_mutex_unlock(&lock);
}
int main() {
pthread_t t[threads];
for(int i =0; i < threads; i++)
pthread_create(&t[i], NULL, handler, (void*) i);
sleep(2);
pthread_cond_signal(&cv);
for(int i =0; i < threads; i++)
pthread_join(t[i], NULL);
return 0;
}