我必須製作一個共享變量(初始值= 35的計數器)和5個線程的程序。我必須製作程序,以便每個線程訪問計數器的值並將其遞減1.這應該持續到計數器= 0爲止。多線程程序中的錯誤
這是我到目前爲止的代碼,但問題是隻有一個線程遞減計數器的值爲0.
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <pthread.h>
#define NTHREADS 5
void *thread_function1(void *);
void *thread_function2(void *);
void *thread_function3(void *);
void *thread_function4(void *);
void *thread_function5(void *);
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
short int counter = 35;
main()
{
pthread_t thread_id[NTHREADS];
pthread_t thread1, thread2, thread3, thread4, thread5;
int status, status2, status3, status4, status5;
status = pthread_create(&thread1, NULL, thread_function1, NULL);
if(status!=0){
fprintf(stderr,"thread 1 failed\n");
}
status2 = pthread_create(&thread2, NULL, thread_function2, NULL);
if(status2!=0){
fprintf(stderr,"thread 2 failed\n");
}
status3 = pthread_create(&thread3, NULL, thread_function3, NULL);
if(status3!=0){
fprintf(stderr,"thread 3 failed\n");
}
status4 = pthread_create(&thread4, NULL, thread_function4, NULL);
if(status4!=0){
printf("thread 4 failed\n");
}
status5 = pthread_create(&thread5, NULL, thread_function5, NULL);
if(status5!=0){
fprintf(stderr,"thread 5 failed\n");
}
//pthread_join(thread1, NULL);
//int x = counter;
printf("created all the threads \n");
printf("joining thread 1");
pthread_join(thread1, NULL);
printf("joining thread 2");
pthread_join(thread2, NULL);
printf("joining thread 3");
pthread_join(thread3, NULL);
printf("joining thread 4");
pthread_join(thread4, NULL);
printf("joining thread 5");
pthread_join(thread5, NULL);
printf("Final counter value: %d\n", counter);
}
void *thread_function1(void *dummyPtr)
{
printf("Thread number %ld\n", pthread_self());
while(counter>0){
srand(time(NULL));
int r = rand()%3;
printf(" %d\n", r);
pthread_mutex_lock(&mutex1);
printf("entered the mutex");
counter--;
printf(" %d\n", counter);
sleep(r);
pthread_mutex_unlock(&mutex1);
printf("mutex unlocked");
pthread_yield();
}
}
void *thread_function2(void *dummyPtr)
{
printf("Thread number %ld\n", pthread_self());
while(counter>0){
srand(time(NULL));
int r = rand()%3;
printf(" %d\n", r);
pthread_mutex_lock(&mutex1);
printf("entered the mutex");
counter--;
printf(" %d\n", counter);
sleep(r);
pthread_mutex_unlock(&mutex1);
pthread_yield();
}
}
void *thread_function3(void *dummyPtr)
{
printf("Thread number %ld\n", pthread_self());
while(counter>0){
srand(time(NULL));
int r = rand()%3;
printf(" %d\n", r);
pthread_mutex_lock(&mutex1);
printf("entered the mutex");
counter--;
printf(" %d\n", counter);
sleep(r);
pthread_mutex_unlock(&mutex1);
pthread_yield();
}
}
void *thread_function4(void *dummyPtr)
{
printf("Thread number %ld\n", pthread_self());
while(counter>0){
srand(time(NULL));
int r = rand()%3;
printf(" %d\n", r);
pthread_mutex_lock(&mutex1);
printf("entered the mutex");
counter--;
printf(" %d\n", counter);
sleep(r);
pthread_mutex_unlock(&mutex1);
pthread_yield();
}
}
void *thread_function5(void *dummyPtr)
{
printf("Thread number %ld\n", pthread_self());
while(counter>0){
srand(time(NULL));
int r = rand()%3;
printf(" %d\n", r);
pthread_mutex_lock(&mutex1);
printf("entered the mutex");
counter--;
printf(" %d\n", counter);
sleep(r);
pthread_mutex_unlock(&mutex1);
pthread_yield();
}
}
任何人都可以請幫忙嗎? 感謝
爲什麼你有5個完全相同的線程函數呢? – asveikau
我做錯了那部分。現在我只有一個線程函數,所有線程都可以訪問這個函數。 –
請通過一個體面的編譯器運行你的代碼,並啓用警告,'-Wall'左右,然後再發布。我用gcc得到10。最重要的是關於未知的'sleep'和'pthread_yield'。如果我使用正確的標題,它會立即發現Antti指出的錯誤。 –