2017-11-27 28 views
-3

뮤텍스를 사용하여 코드 영역을 잠그려고합니다. 최대한 많은 코드를 게시하려고했습니다.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 

나는 무엇이 잘못되었는지 알지 못합니다.

+0

어디에서 충돌이 발생합니까? 그리고 어떤 산출물을 얻습니까? –

+0

C++의 경우 : pthread가 아닌 std :: thread를 사용하십시오. –

+0

'store_1'과'store_2'에 초기화 된 것은 무엇입니까? 그들은 int 포인터입니까? – LethalProgrammer

답변

0

다음은 C++ std::thread을 사용하도록 업데이트 된 동일한 프로그램입니다. 간단한 프로그램으로 충돌을 피할 수 있습니다.

#include <thread> 
#include <mutex> 
#include <cstdio> 

//Global Variables 
int sum; 
long long fact = 1; 
//pthread_mutex_t lock; 
std::mutex m; 
//pthread_t id1, id2; 
std::thread id1, id2; 

//void *thread_1_And_2(void *accept_1) 
void thread_1_And_2(int a) 
{ 
    ////Accepting Input 
    //int *a_ptr = (int*)accept_1; 
    //int a = *a_ptr; 

    //Locking the resource 
    //pthread_mutex_lock(&lock); 
    std::lock_guard<std::mutex> lock(m); 

    //Returning the process ID that is working right now! 
    //pthread_t my_current_id; 
    //my_current_id = pthread_self(); 
    std::thread::id my_current_id = std::this_thread::get_id(); 

    //if((pthread_equal(id1, my_current_id))>0) 
    if(id1.get_id() == my_current_id) 
    { 

     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) 
    else if(id2.get_id() == my_current_id) 
    { 
     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); // RAII will do this 

    //return 0; 
} 

int main() 
{ 
    ////Mutex Initialisation 
    //if(pthread_mutex_init(&lock, NULL) != 0) 
    //{ 
    // printf("\nMutex Initialisation has Failed\n"); 
    // return 1; 
    //} 
    { 

     std::lock_guard<std::mutex> lock(m); 

     //Creating Threads 
     id1 = std::thread{[]() {thread_1_And_2(3); }}; 
     id2 = std::thread{[]() {thread_1_And_2(4); }}; 
     //pthread_create(&id1, NULL, &thread_1_And_2, &store_1);//For Sum 
     //pthread_create(&id2, NULL, &thread_1_And_2, &store_2);//For Factorial 

     //Destroying the Mutex 
     //pthread_mutex_destroy(&lock); // RAII will take care of the lock 
    } 

    id1.join(); 
    id2.join(); 
} 
+0

나와 같은 똑같은 일을하고 있습니다. 그냥 당신이 Cpp를 사용하고 C를 사용하고 있습니다 나는 왜 내가 세그멘테이션 오류를 얻고 있는지 전혀 모른다. –