pthread分割故障

Pthread segmentation fault

本文关键字:故障 分割 pthread      更新时间:2023-10-16

以下代码已在C 中编写,以运行带有两个线程的奇数排序。我在执行时收到了一个细分错误。我在第55、57和62行的GDB中尝试了GDB。但是在这些断点后,细分误差跃升了。无法弄清楚错误在哪里。

#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;
}

您的代码有许多问题,

  • 计算数组的长度应作为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;
}

编辑。请参阅LIVE。