हैलो, मैं बहु-थ्रेड प्रोग्रामिंग के लिए नया हूं। मैं एक कोड बनाने की कोशिश कर रहा हूं जो थ्रेड THREAD1 बनाता है, कि, कुछ करने के बाद, यह दो अन्य धागे ट्रिगर करता है, THREAD2 और THREAD3 कहता है, और फिर बाहर निकलता है।pthreads: एक थ्रेड जो अन्य धागे को ट्रिगर करता है
मैंने दो संभावित समाधान लिखे।
1) हालत चर का उपयोग करें (काम नहीं करता है: कुछ मामले में मैं एक गतिरोध प्राप्त):
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 सीधे दो अन्य धागे पैदा करता है।
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;
}
मैं आपकी राय जानना चाहते हैं। आपको बहुत बहुत धन्यवाद
हालत चर के
आपका दूसरा कार्यान्वयन ठीक काम करता प्रतीत होता है, आपको क्या लगता है कि इसमें गलत है? – engineerC
आपका दूसरा विकल्प क्लीनर और अच्छा है। मैं वह करूँगा –
@ कैप्टनमर्फी: मुझे आश्चर्य है कि इस लक्ष्य तक पहुंचने का एक बेहतर तरीका है या नहीं। POSIX मैन्युअल पृष्ठों से, ऐसा लगता है कि हालत चर इस उद्देश्य के लिए बेहतर अनुकूल हैं क्योंकि इन्हें किसी विशेष घटना के लिए सिग्नल करने के लिए उपयोग किया जा सकता है। –