以下代码用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;
}
答案 0 :(得分:0)
您的代码存在许多问题,
sizeof(arr)/sizeof(arr[0])
有这样的事情:
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. 强>