내 프로그램의 출력을 동기화하기 위해 pthread 뮤텍스 변수와 장벽을 사용하려하지만 원하는 방식으로 작동하지 않습니다. 각 thread는 최종 값을 for 루프에서 오는 매 20 개의 값으로 보았습니다.하지만 모두 최종 값이 같도록하려고합니다. (5 개의 스레드를 사용하는 경우 모두 100을 최종 값으로보아야합니다. , 스레드 4 개 포함, 80 등)C에서 mutex와 barrier를 사용하여 스레드 동기화
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int SharedVariable =0;
void *SimpleThread(void *args)
{
int num,val,rc;
int which =(int)args;
rc = pthread_mutex_lock(&mutex1);
for(num=0; num<20; num++){
#ifdef PTHREAD_SYNC
if(random() > RAND_MAX/2)
usleep(10);
#endif
//pthread_mutex_lock(&mutex1);
val = SharedVariable;
printf("*** thread %d sees value %d\n", which, val);
//pthread_mutex_lock(&mutex1);
SharedVariable = val+1;
pthread_mutex_unlock(&mutex1);
}
val=SharedVariable;
printf("Thread %d sees final value %d\n", which, val);
//pthread_mutex_destroy(&mutex1);
//pthread_exit((void*) 0);
//pthread_mutex_unlock(&mutex1);
}
int main (int argc, char *argv[])
{
if(atoi(argv[1]) > 0){
int num_threads = atoi(argv[1]);
//pthread_mutex_init(&mutex1, NULL);
pthread_t threads[num_threads];
int rc;
long t;
rc = pthread_mutex_lock(&mutex1);
for(t=0; t< num_threads; t++){
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, SimpleThread, (void*)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
//pthread_join(thread1);
}
rc= pthread_mutex_unlock(&mutex1);
}
else{
printf("ERROR: The parameter should be a valid positive number.");
exit(-1);
}
pthread_mutex_destroy(&mutex1);
pthread_exit(NULL);
}
대단히 감사합니다. 고맙습니다!
이는 ARGV를 읽고 [1] 그것은 시작 숫자는 첫 번째 숫자를 읽고 나머지는 무시합니다. 예를 들어 "3sdfsdf"가 3 개의 스레드를 생성합니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까? – randomizertech
@ fgualda87 :'atoi()'대신'strtol()'을 사용하십시오 - 변환 된 숫자 뒤의 첫 번째 문자를 알려주며 전체 문자열이 유효한지 확인할 수 있습니다. 이것이 명확하지 않은 경우 다른 질문으로 질문하십시오. – caf