2012-04-15 3 views
8

У меня большая проблема, я не могу понять, почему мьютексы в C не работают, как я ожидаю. Это мой код:POSIX C Threads. Пример Mutex. Не работает должным образом

#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 «Func» сообщения, а затем 100 сообщений «anotherFunc». Я ожидаю, что это выполнение для достижения func и блокировки мьютекса. Когда выполнение достигнет anotherFunc, я ожидаю, пока func не разблокирует мьютекс. Но я получаю вмешивались сообщения как

FUNC Func функ anotherFunc anotherFunc anotherFunc функ anotherFunc

Я не понимаю, как эта штука работает. Пожалуйста помоги!

ответ

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

pthread_mutex_destroy(&mymutex); 

Вы разрушаете мьютекс до нити сделаны с ним, так что все ставки выключены. Вы, вероятно, захотите, чтобы pthread_join 2 потока, прежде чем уничтожить его.

+0

Я думаю, что это работает :) Это мой окончательный код для тех, кто заинтересован ... http://pastebin.me/bc23773578d79a55882d7ced4e04b026 –

+0

По-прежнему сломан. Вы только убедитесь, что * one * thread закончен, когда вы уничтожаете мьютекс. Что делать, если еще не сделано? Нет никакой гарантии, что нить начнется, приобретет мьютекс или закончится в каком-либо конкретном порядке, если вы каким-либо образом не заставите ее. (Урок один из многопоточности таков: вещи гарантированы только в определенном порядке, если вы заставите их произойти в этом порядке.) –

+0

Да, но у меня есть обе функции, запущенные в одном потоке, единственный поток: mythread. Можно ли это сделать или всегда безопаснее использовать один поток для одной функции? –

2

Я получил несколько ошибок comiplation

  • Я не мог объявить INT I в для петли

  • использовано имя аргумента аргумент в качестве аргумента для нитей "Func" и "anotherFunc"

Я использовал pthread_join до, разрушая мьютексы.

Таким образом я разрушающий мой мьютекс «mymutex» после обоего нитей «Func» и «anotherFunc» завершил их исполнение

Также каждую нить в настоящее время имеет свой собственный идентификатор потока «MyThread1» и «MyThread2» так, таким образом, я могу использовать pthread_join() функцию для каждого потока

#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; 
} 
Смежные вопросы