試圖實施兩名平行工作者。形成數據後,我需要告訴工作人員採集數據並對其進行處理。這裏是代碼:如何使用pthread_cond_signal和pthread_cond_wait正確地使pthreads工作?
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
void *worker(void *data);
struct worker_data_t
{
pthread_t thread_id;
pthread_mutex_t mutex;
pthread_cond_t cond;
long id, data;
};
struct worker_data_t *workers_data;
int main(int argc, char **argv)
{
int cpus = sysconf(_SC_NPROCESSORS_ONLN);
if (cpus < 1)
cpus = 1;
workers_data = (struct worker_data_t *)malloc(cpus * sizeof(struct worker_data_t));
int ret_val[cpus];
for (int i = 0; i < cpus; i++)
{
pthread_mutex_init(&workers_data[i].mutex, NULL);
pthread_cond_init(&workers_data[i].cond, NULL);
workers_data[i].id = i;
}
for (int i = 0; i < cpus; i++)
ret_val[i] = pthread_create(&workers_data[i].thread_id, NULL, worker, &workers_data[i]);
pthread_mutex_lock(&workers_data[0].mutex);
pthread_cond_signal(&workers_data[0].cond);
pthread_mutex_unlock(&workers_data[0].mutex);
pthread_mutex_lock(&workers_data[0].mutex);
pthread_cond_signal(&workers_data[0].cond);
pthread_mutex_unlock(&workers_data[0].mutex);
for (int i = 0; i < cpus; i++)
pthread_join(workers_data[i].thread_id, NULL);
return 0;
}
void *worker(void *data)
{
struct worker_data_t d = *((struct worker_data_t*)(data));
printf("Thread %d started\n", d.id);
for (;;)
{
pthread_mutex_lock(&workers_data[d.id].mutex);
pthread_cond_wait(&workers_data[d.id].cond, &workers_data[d.id].mutex);
printf("catch!\n");
pthread_mutex_unlock(&workers_data[d.id].mutex);
}
}
在通過pthread_cond_signal通知worker後沒有任何反應。如果我在每個pthread_cond_signal塊之前放置睡眠(1),它就會起作用。
應該怎麼做才能讓它在沒有睡眠的情況下工作?
雖然這個答案充滿了正確的信息,但它並沒有解決最重要的問題,即條件變量**永遠不能在沒有關聯謂詞**的情況下使用。 –