के रूप में काम नहीं करता मैंने एक कार्यक्रम लिखा था और यह काम नहीं करता है क्योंकि मैं इसकी उम्मीद करता हूं। मेरे पास दो धागे हैं: thread
ट्रिगर्स func
और anotherThread
anotherFunc
ट्रिगर्स। मैं क्या करना चाहता था जब cont
10
func
, anotherThread
pthread_cond_wait
और pthread_cond_signal
का उपयोग करके ट्रिगर करने के लिए मूल्य 10
तक पहुंचता है। अगर मैं sleep(1)
लाइन को असम्बद्ध करता हूं तो अजीब चीज सब ठीक काम करती है। मैं धागे के लिए नया हूं और मैं ट्यूटोरियल here का पालन कर रहा था और यदि मैं उनके उदाहरण में sleep
लाइन पर टिप्पणी करता हूं तो यह भी टूट जाता है।पॉज़िक्स सी थ्रेड्स। उदाहरण के लिए pthread_cond_t। अपेक्षित
मेरा सवाल यह है कि मैं बिना किसी sleep()
कॉल के बिना यह काम कैसे कर सकता हूं? और क्या होता है यदि मेरे कोड में func
anotherFunc
के बाद pthread_mutex_lock
तक पहुंचता है? मैं इन चीजों को कैसे नियंत्रित कर सकता हूं? यह मेरा कोड है:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t myMutex;
pthread_cond_t cond;
pthread_attr_t attr;
int cont;
void *func(void*)
{
printf("func\n");
for(int i = 0; i < 20; i++)
{
pthread_mutex_lock(&myMutex);
cont++;
printf("%d\n", cont);
if(cont == 10)
{
printf("signal:\n");
pthread_cond_signal(&cond);
// sleep(1);
}
pthread_mutex_unlock(&myMutex);
}
printf("Done func\n");
pthread_exit(NULL);
}
void *anotherFunc(void*)
{
printf("anotherFunc\n");
pthread_mutex_lock(&myMutex);
printf("waiting...\n");
pthread_cond_wait(&cond, &myMutex);
cont += 10;
printf("slot\n");
pthread_mutex_unlock(&myMutex);
printf("mutex unlocked anotherFunc\n");
printf("Done anotherFunc\n");
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t thread;
pthread_t anotherThread;
pthread_attr_init(&attr);
pthread_mutex_init(&myMutex, NULL);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_cond_init(&cond, NULL);
pthread_create(&anotherThread, &attr, anotherFunc, NULL);
pthread_create(&thread, &attr, func, NULL);
pthread_join(thread, NULL);
pthread_join(anotherThread, NULL);
printf("Done MAIN()");
pthread_mutex_destroy(&myMutex);
pthread_cond_destroy(&cond);
pthread_attr_destroy(&attr);
pthread_exit(NULL);
return 0;
}
लंबे पद के लिए क्षमा करें, लेकिन मैं धागे के लिए नया हूँ और मैं जानने के लिए तैयार हूँ। क्या आप लिनक्स पर धागे और नेटवर्किंग पर कुछ अच्छे संदर्भ या पाठ्यक्रम/ट्यूटोरियल भी जानते हैं? मैं एक चैट क्लाइंट बनाना सीखना चाहता हूं और मैंने सुना है कि मुझे इसके लिए धागे और नेटवर्किंग जानना है। समस्या यह है कि अगर मैं सीखता हूं तो मुझे बहुत अच्छा पता नहीं है क्योंकि मुझे नहीं पता कि मुझे क्या पता होना है।
बहुत बहुत शुक्रिया :)
अन्य टिप्पणियां। मैं 'pthread_attr_t' का उपयोग न करने के अलावा, आप कोड को सरल बनाने के लिए स्थिति और म्यूटेक्स के लिए स्थिर प्रारंभकर्ताओं का उपयोग कर सकते हैं। इसके अलावा, आपके थ्रेड फ़ंक्शन 'pthread_exit' को कॉल करने के बजाय' वापस लौट सकते हैं 'या 'वापसी 0;' कर सकते हैं। और आपका मुख्य धागा 'pthread_exit' को कॉल किए बिना मुख्य रूप से' वापस 0; 'कर सकता है। अन्य धागे उस बिंदु पर नहीं चल रहे हैं क्योंकि वे शामिल हुए थे। मुख्य बलों से एक प्रक्रिया से बाहर निकलें, लेकिन प्राथमिक थ्रेड में 'pthread_exit' एक प्रक्रिया से बाहर निकलने के लिए मजबूर नहीं होता है, जो अन्य थ्रेड चलने के लिए उपयोगी है। – Kaz
इसके अलावा, स्थैतिक म्यूटेक्स और शर्तों को साफ करने की कोई आवश्यकता नहीं है। बस 'pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER; 'का उपयोग करें। परिस्थितियों के लिए जटिल प्रारंभिकरण की आवश्यकता होती है जहां आप असामान्य विशेषताओं को सेट करना चाहते हैं। जैसे एक प्रक्रिया-साझा मजबूत म्यूटेक्स बनाओ। – Kaz