Xin chào, Tôi mới làm quen với lập trình đa luồng. Tôi đang cố gắng tạo mã tạo ra một chuỗi THREAD1, sau khi nó đã làm điều gì đó, nó kích hoạt hai luồng khác, nói THREAD2 và THREAD3, rồi thoát ra.pthreads: một chuỗi kích hoạt các chủ đề khác
Tôi đã viết hai giải pháp khả thi.
1) Sử dụng các biến điều kiện (KHÔNG LÀM VIỆC: trong một số trường hợp tôi nhận được một bế tắc):
pthread_mutex_t ready_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t ready_cond = PTHREAD_COND_INITIALIZER;
bool ready = false;
void* trigger(void*);
void* func1(void*);
void* func2(void*);
int main()
{
pthread_t thread1;
pthread_t thread2;
pthread_t thread3;
pthread_create(&thread1, 0, &trigger, 0);
pthread_create(&thread2, 0, &func1, 0);
pthread_create(&thread3, 0, &func2, 0);
pthread_join(thread1, 0);
pthread_join(thread2, 0);
pthread_join(thread3, 0);
}
void *trigger(void*)
{
pthread_mutex_lock(&ready_mutex);
ready = true;
pthread_cond_broadcast(&ready_cond);
pthread_mutex_unlock(&ready_mutex);
return 0;
}
void *func1(void*)
{
while (!ready) // Needed to avoid spuriuos wake-up
{
pthread_mutex_lock(&ready_mutex);
pthread_cond_wait(&ready_cond, &ready_mutex);
pthread_mutex_unlock(&ready_mutex);
}
std::cout << "In 'func1'>> Do something" << std::endl;
return 0;
}
void *func2(void*)
{
while (!ready) // Needed to avoid spuriuos wake-up
{
pthread_mutex_lock(&ready_mutex);
pthread_cond_wait(&ready_cond, &ready_mutex);
pthread_mutex_unlock(&ready_mutex);
}
std::cout << "In 'func2'>> Do something" << std::endl;
return 0;
}
2) thread1 trực tiếp tạo ra hai chủ đề khác.
pthread_mutex_t ready_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t ready_cond = PTHREAD_COND_INITIALIZER;
pthread_t thread1;
pthread_t thread2;
pthread_t thread3;
void* trigger(void*);
void* func1(void*);
void* func2(void*);
int main()
{
pthread_create(&thread1, 0, &trigger, 0);
pthread_join(thread1, 0);
pthread_join(thread2, 0);
pthread_join(thread3, 0);
}
void *trigger(void*)
{
std::cout << "In 'trigger'>> Do something" << std::endl;
pthread_create(&thread2, 0, &func1, 0);
pthread_create(&thread3, 0, &func2, 0);
return 0;
}
void *func1(void*)
{
std::cout << "In 'func1'>> Do something" << std::endl;
return 0;
}
void *func2(void*)
{
std::cout << "In 'func2'>> Do something" << std::endl;
return 0;
}
tôi muốn biết ý kiến của bạn. Thank you very much
Triển khai thứ hai của bạn dường như hoạt động tốt, bạn nghĩ điều gì sai với nó? – engineerC
Tùy chọn thứ hai của bạn sạch và đẹp hơn. Tôi sẽ làm điều đó. –
@CaptainMurphy: Tôi tự hỏi nếu có cách nào tốt hơn để đạt được mục tiêu này. Từ trang hướng dẫn sử dụng POSIX, có vẻ như với tôi rằng các biến điều kiện phù hợp hơn với mục tiêu này vì chúng có thể được sử dụng để báo hiệu cho một sự kiện cụ thể. –