Pthread分段错误

时间:2014-03-09 10:40:53

标签: c++

以下代码用c ++编写,用两个线程运行奇偶类。我在执行时收到了分段错误。我尝试使用gdb,在第55,57和62行有断点。但是在这些断点之后,分段错误跳了起来。无法弄清楚错误的位置。

#include <iostream>
#include <pthread.h>

#define num 2

pthread_mutex_t mutex1=PTHREAD_MUTEX_INITIALIZER;

using namespace std;

nt arr[]={10,9,23,45,78,11,89,45,92,5,23,76,34,21,59,76};

void* odd_even(void* data){
int a=*((int*)data);
int temp;
bool sorted=false;

pthread_mutex_lock(&mutex1);
while(!sorted){
   if(a==0){
    sorted=true;
    for(int i=0;i<sizeof(arr)-1;i+=2){
        if(arr[i]>arr[i+1]){
            temp=arr[i];
            arr[i]=arr[i+1];
            arr[i+1]=temp;
            sorted=false;
        }
    }
   }
   else if(a==1){
    sorted=true;
    for(int i=1;i<sizeof(arr)-1;i+=2){
        if(arr[i]>arr[i+1]){
            temp=arr[i];
            arr[i]=arr[i+1];
            arr[i+1]=temp;
            sorted=false;
        }
    }
   }
}//end while
pthread_mutex_unlock(&mutex1);
//pthread_exit(NULL);
}

int main(){

//int arr[]={10,9,23,45,78,11,89,45,92,5,23,76,34,21,59,76};
nt a[]={0,1,2};
int thread_id;
thread_t pth[num];
pthread_t dthread;

for(int i=0;i<num;i++){
   thread_id=pthread_create(&pth[i],NULL,odd_even,(void*)&a[i]);
   if(thread_id){
       cout<<"Thread creation fail"<<endl;
       return 0;
   }        
}
for(int j=0;j<num;j++)
  pthread_join(pth[j],NULL);

pthread_exit(NULL);
return 0;
}

1 个答案:

答案 0 :(得分:0)

您的代码存在许多问题,

  • 计算数组的长度应该是sizeof(arr)/sizeof(arr[0])
  • 争取奇数甚至应该将索引增加2而不是1

有这样的事情:

void* odd_even(void* data)
{
    int a=*((int*)data);
    volatile bool sorted=false;
    unsigned int arr_length = sizeof(arr)/sizeof(arr[0]);
    pthread_mutex_lock(&mutex1);
    while(!sorted) {
        if (a==0) {
            sorted=true;
            for(unsigned int i=0; i < arr_length-2; i+=2) {
                if(arr[i] > arr[i+2]){
                    std::swap(arr[i], arr[i+2]);
                    sorted=false;
                }
            }
        }
        else if (a==1) {
            sorted=true;
            for(unsigned int i=1; i < arr_length-2; i+=2){
                if(arr[i] > arr[i+2]){
                    std::swap(arr[i], arr[i+2]);
                    sorted=false;
                }
            }
        }
    }//end while
    pthread_mutex_unlock(&mutex1);
    pthread_exit(NULL);
    return nullptr;
}

修改。 See live.