2012-04-15 21 views
8

मुझे एक बड़ी समस्या है, मैं यह नहीं समझ सकता कि सी में म्यूटेक्स क्यों काम नहीं करते हैं।पॉज़िक्स सी थ्रेड्स। म्यूटेक्स उदाहरण। उम्मीद के अनुसार काम न करें

#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

मुझे समझ नहीं आता इस बात कैसे काम करता है। कृपया सहायता कीजिए!

उत्तर

16
pthread_create(&mythread, NULL, func, NULL); 
pthread_create(&mythread, NULL, anotherFunc, NULL); 

pthread_mutex_destroy(&mymutex); 

आप म्युटेक्स को नष्ट कर रहे हैं से पहले धागे इसके साथ किया जाता है, इसलिए सभी दांव बंद कर रहे हैं। आप इसे नष्ट करने से पहले 0 धागा2 थ्रेड चाहते हैं।

+0

के लिए pthread_join() फ़ंक्शन का उपयोग कर सकते में मैं यह काम करता है लगता है :) यह रुचि किसी के लिए अपने अंतिम कोड है ... http://pastebin.me/bc23773578d79a55882d7ced4e04b026 –

+0

अभी भी टूटा हुआ है। आप केवल यह सुनिश्चित करते हैं कि जब आप mutex को नष्ट करते हैं तो * एक * धागा समाप्त हो गया है। क्या होगा यदि दूसरा अभी तक नहीं किया गया है? कोई गारंटी नहीं है कि थ्रेड शुरू हो जाएगा, म्यूटेक्स प्राप्त करें, या किसी भी विशेष क्रम में खत्म न करें जबतक कि आप इसे किसी भी तरह मजबूर नहीं करते। (मल्टीथ्रेडिंग में से एक सबक यह है: चीजों को केवल एक विशेष क्रम में होने का आश्वासन दिया जाता है यदि आप उन्हें उस क्रम में होने के लिए मजबूर करते हैं।) –

+0

हाँ, लेकिन मेरे पास दोनों कार्य एक धागे में शुरू हुए हैं, केवल धागा: मिथ्रेड। क्या ऐसा करना ठीक है या एक फ़ंक्शन के लिए एक थ्रेड का उपयोग करना हमेशा सुरक्षित रहता है? –

2

मुझे मिल गया कुछ comiplation त्रुटियों

  • मैं पाश के लिए में पूर्णांक मैं की घोषणा नहीं कर सकता

  • धागे "समारोह" के लिए एक तर्क के रूप आर्ग एक तर्क नाम प्रयुक्त और "anotherFunc"

मैंने pthread_join म्यूटेक्स को नष्ट करने से पहले उपयोग किया है।

इस तरह मैं दोनों धागे "समारोह" और "anotherFunc" के बाद मेरे म्युटेक्स "mymutex" को नष्ट कर रहा हूँ में उनके निष्पादन पूरा कर लिया है

इसके अलावा प्रत्येक धागे अब अपने स्वयं के धागे आईडी है "mythread1" और "mythread2" तो इस तरह से मैं एक धागा

#include <stdlib.h> 
#include <stdio.h> 
#include <pthread.h> 

pthread_t mythread1, mythread2; 
pthread_mutex_t mymutex; 

void *anotherFunc(void *arg) 
{ 
    pthread_mutex_lock(&mymutex); 
    int i; 

    for(i = 0; i < 100; i++) 
     printf("anotherFunc\n"); 

    pthread_mutex_unlock(&mymutex); 

    pthread_exit(NULL); 
} 

void *func(void *arg) 
{ 
    pthread_mutex_lock(&mymutex); 
    int i; 
    for(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(&mythread1, NULL, func, NULL); 
    pthread_create(&mythread2, NULL, anotherFunc, NULL); 


    pthread_join(mythread1, NULL); 
    pthread_join(mythread2, NULL); 

    pthread_mutex_destroy(&mymutex); 

    return EXIT_SUCCESS; 
}