【问题标题】:Pthread join segmentation faultPthread 连接分段错误
【发布时间】:2015-06-12 07:24:29
【问题描述】:

我有以下代码,其中两个数组通过两个线程进行了不同的修改(在一种情况下,每个元素递增 1,在另一种情况下,每个元素递减 1)。它给出了分段错误。能指出错误吗?

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
void *decrement(void *object){

  int *array = (int *)object;
  for(int i=0;i<5;i++){
    array[i]=array[i]-1;
  }

}

void *increment(void *object){

  int *array = (int *)object;
  for(int i=0;i<5;i++){
    array[i]=array[i]+1;
  }
}
int main(int argc, char const *argv[]){
  int segments = 2;
  pthread_t threads[segments];
  int i;

  int numbers[5] = {1,3,2,9,11}; 
  int numbers1[5] = {0,14,12,4,10};



  int *array;
  array=numbers;
  pthread_create(&threads[0], NULL, increment, (void *) &array);

  int *array1;
  array1=numbers1;
  pthread_create(&threads[1], NULL, decrement, (void *) &array1);
  for(i = 0; i < 2; i++){
      pthread_join(threads[i], NULL);
  }
  for(i = 0; i < 5; i++){
      printf("%d\n", array[i]);
      printf("%d\n", array1[i]);
  }
  pthread_exit(NULL);
}

【问题讨论】:

  • 只是问,size在线程函数中有什么用?

标签: c multithreading pthreads


【解决方案1】:

让我们来看看:

int *array;
array=numbers;
pthread_create(&threads[0], NULL, increment, (void *) &array);

这里你将变量array的地址传递给线程函数,但是array本身指向数组,变量的地址却没有。

如果你想使用临时变量,只需使用变量本身即可:

pthread_create(&threads[0], NULL, increment, array);

请注意缺少强制转换和缺少地址运算符。

但你并不真的需要临时的array 变量,因为数组会衰减为指针,所以你可以这样做

pthread_create(&threads[0], NULL, increment, numbers);

为了更形象地说明您的问题,您所拥有的是:

+--------+ +--------+ +---------+ | &数组 | ---> |数组 | ---> |数字 | +--------+ +--------+ +---------+

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 2011-10-26
    • 2016-04-22
    • 2016-11-05
    • 2015-01-08
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多