मुझे एक बड़ी समस्या है, मैं यह नहीं समझ सकता कि सी में म्यूटेक्स क्यों काम नहीं करते हैं।पॉज़िक्स सी थ्रेड्स। म्यूटेक्स उदाहरण। उम्मीद के अनुसार काम न करें
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
pthread_t mythread;
pthread_mutex_t mymutex;
void *anotherFunc(void*)
{
pthread_mutex_lock(&mymutex);
for(int i = 0; i < 100; i++)
printf("anotherFunc\n");
pthread_mutex_unlock(&mymutex);
pthread_exit(NULL);
}
void *func(void*)
{
pthread_mutex_lock(&mymutex);
for(int i = 0; i < 100; i++)
printf("func\n");
pthread_mutex_unlock(&mymutex);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_mutex_init(&mymutex, NULL);
pthread_create(&mythread, NULL, func, NULL);
pthread_create(&mythread, NULL, anotherFunc, NULL);
pthread_mutex_destroy(&mymutex);
pthread_exit(NULL);
return EXIT_SUCCESS;
}
क्या मैं होने की अपेक्षा कार्यक्रम पहले 100 "समारोह" संदेश और फिर 100 "anotherFunc" संदेश मुद्रित करने के लिए है: यह मेरा कोड है। मुझे उम्मीद है कि func तक पहुंचने और म्यूटेक्स को लॉक करने के लिए निष्पादन है। जब निष्पादन किसी अन्य फनक तक पहुंच जाता है, तो मैं प्रतीक्षा करता हूं जब तक func mutex को अनलॉक न करे। लेकिन मैं की तरह
समारोह समारोह समारोह anotherFunc anotherFunc anotherFunc समारोह दखल संदेश प्राप्त anotherFunc
मुझे समझ नहीं आता इस बात कैसे काम करता है। कृपया सहायता कीजिए!
के लिए pthread_join() फ़ंक्शन का उपयोग कर सकते में मैं यह काम करता है लगता है :) यह रुचि किसी के लिए अपने अंतिम कोड है ... http://pastebin.me/bc23773578d79a55882d7ced4e04b026 –
अभी भी टूटा हुआ है। आप केवल यह सुनिश्चित करते हैं कि जब आप mutex को नष्ट करते हैं तो * एक * धागा समाप्त हो गया है। क्या होगा यदि दूसरा अभी तक नहीं किया गया है? कोई गारंटी नहीं है कि थ्रेड शुरू हो जाएगा, म्यूटेक्स प्राप्त करें, या किसी भी विशेष क्रम में खत्म न करें जबतक कि आप इसे किसी भी तरह मजबूर नहीं करते। (मल्टीथ्रेडिंग में से एक सबक यह है: चीजों को केवल एक विशेष क्रम में होने का आश्वासन दिया जाता है यदि आप उन्हें उस क्रम में होने के लिए मजबूर करते हैं।) –
हाँ, लेकिन मेरे पास दोनों कार्य एक धागे में शुरू हुए हैं, केवल धागा: मिथ्रेड। क्या ऐसा करना ठीक है या एक फ़ंक्शन के लिए एक थ्रेड का उपयोग करना हमेशा सुरक्षित रहता है? –