Pthread连接段错误
Pthread join segmentation fault
我有以下代码,其中两个数组被两个线程以不同方式修改(在一种情况下每个元素递增 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);
}
让我们走这些路线:
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);
为了更形象地说明您的问题,您所拥有的是:
+--------+ +-------+ +---------+
| &array | ---> | array | ---> | numbers |
+--------+ +-------+ +---------+
我有以下代码,其中两个数组被两个线程以不同方式修改(在一种情况下每个元素递增 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);
}
让我们走这些路线:
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);
为了更形象地说明您的问题,您所拥有的是:
+--------+ +-------+ +---------+ | &array | ---> | array | ---> | numbers | +--------+ +-------+ +---------+