뮤텍스를 사용하여 코드 영역을 잠그려고합니다. 최대한 많은 코드를 게시하려고했습니다.Pthread 프로그래밍 : 분할 오류 : 뮤텍스를 사용하는 동안
//Global Variables
int sum;
long long fact=1;
pthread_mutex_t lock;
pthread_t id1,id2;
void *thread_1_And_2(void *accept_1)
{
//Accepting Input
int *a_ptr = (int*) accept_1;
int a= *a_ptr;
//Locking the resource
pthread_mutex_lock(&lock);
//Returning the process ID that is working right now!
pthread_t my_current_id;
my_current_id= pthread_self();
if((pthread_equal(id1,my_current_id))>0)
{
printf("\nI am Thread 1: Processing Sum\n");
printf("\n I am in Thread 1 \n");
for (int i=0; i<a; i++)
{
sum= sum+i;
}
}
else if((pthread_equal(id2, my_current_id))>0)
{
printf("\nI am Thread 2: Processing Factorial\n");
if (a<0)
{
printf("\n Error! Factorial of Negative number not possible \n");
}
else
{
for(int i=1; i<=a; i++)
{
fact=fact*i;
}
}
}
//Unlocking the Mutex
pthread_mutex_unlock(&lock);
return 0;
}
다음과 같이 주요 fucntion에는 초기화 및 호출됩니다
printf("\n Input for thread_1:\n");
int store_1; //= atoi(argv[1]);
printf("\nEnter number up to which you want a sum of natural numbers\n");
scanf("%d", &store_1);
printf("\nInput for thread_2:\n");
int store_2; //= atoi(argv[2]);
printf("\nEnter number whose factorial needs to be found\n");
scanf("%d", &store_2);
//Mutex Initialisation
if (pthread_mutex_init(&lock, NULL) != 0)
{
printf("\nMutex Initialisation has Failed\n");
return 1;
}
//Creating Threads
pthread_create(&id1, NULL, &thread_1_And_2, &store_1);//For Sum
pthread_create(&id2, NULL, &thread_1_And_2, &store_2);//For Factorial
//Joining All Threads
pthread_join(id1, NULL);
pthread_join(id2, NULL);
//Destroying the Mutex
pthread_mutex_destroy(&lock);
//Printing
printf("\n Output of Thread 1 is Sum = %d \n", sum);
printf("\n Output of Thread 2 is Factorial = %llu \n", fact);
출력 :
"I am in Thread 1"
"I am in Thread 2"
일시 :
Asking input for:
"Enter number upto which you want a sum of natural numbers"
Input Given: 5
Asking input for:
"Enter number whose factorial needs to be found"
Input Given: 3
이제 화면 인쇄입니다 잠시 동안 그리고 나서
Segmentation Fault: 11
나는 무엇이 잘못되었는지 알지 못합니다.
어디에서 충돌이 발생합니까? 그리고 어떤 산출물을 얻습니까? –
C++의 경우 : pthread가 아닌 std :: thread를 사용하십시오. –
'store_1'과'store_2'에 초기화 된 것은 무엇입니까? 그들은 int 포인터입니까? – LethalProgrammer