[英]Attempting to understand multithreading which involves struct. Getting output "Segmentation fault (core dumped)"
我創建這個程序是為了理解多線程,並用單線程測試了這個程序並且可以正常工作。 基本上你輸入 3 位數。 第一個作為初始數字,第二個是它將運行多少個序列,最后一個數字用於所需的線程數。 程序將在具有以下內容的結構中添加前 2 個數字:開始、迭代和結果。 該算法將開始將第一個數字乘以 2,即您在第二個數字中輸入的次數。 例如:1 3 2。
我已經完成了正常工作的程序。 但是一旦我引入 pthread,我就會收到分段核心轉儲錯誤。 我花了幾個小時試圖確定是什么原因造成的,但沒有運氣。
//The program will do: 1 * 2 = 2, 2 * 2 = 4, 4 * 2 = 8
//The results will be stored in a the struct result which is a pointer.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
struct Params
{
int start;
int iteration;
int *result;
};
void *double_number(void *vFirststruct)
{
struct Params *Firststruct = (struct Params *)vFirststruct;
int iter = 0;
Firststruct->result = (int *)malloc(sizeof(int) * Firststruct->iteration);
for (iter = 0; iter < Firststruct->iteration; iter++)
{
// printf("%d\n", Firststruct->start);
Firststruct->start = Firststruct->start * 2;
Firststruct->result[iter] = Firststruct->start;
}
}
void double_number_Single_Thread(struct Params *Firststruct)
{
int iter = 0;
Firststruct->result = (int *)malloc(sizeof(int) * Firststruct->iteration);
for (iter = 0; iter < Firststruct->iteration; iter++)
{
printf("%d\n", Firststruct->start);
Firststruct->start = Firststruct->start * 2;
Firststruct->result[iter] = Firststruct->start;
}
}
int main(int argc, char *argv[])
{
struct Params *Firststruct = (struct Params *)malloc(sizeof(struct Params));
Firststruct->start = atoi(argv[1]);
Firststruct->iteration = atoi(argv[2]);
int threads = atoi(argv[3]);
//For Single Thread
// double_number_Single_Thread(Firststruct); // <-- testing on single thread
// for (int i = 0; i < Firststruct->iteration; i++)
// {
// printf("%d %d\n", i, Firststruct->result[i]);
// }
//End for Single Thread
//Start of Single thread using pthread-Thread
pthread_t *t = (pthread_t *)malloc(threads * sizeof(pthread_t));
pthread_create(&t[0], NULL, &double_number, (void *)&Firststruct);
pthread_join(t[0], NULL);
//End for Single Thread
//Start of Multi thread
// for (int i = 0; i < threads; i++)
// {
// pthread_create(&t[i], NULL, &double_number, (void *)&Firststruct);
// }
// for (int i = 0; i < threads; i++)
// {
// pthread_join(t[i], NULL);
// }
free(Firststruct);
return 0;
}
您遇到的主要問題(忽略不同線程將修改相同數據的事實)是您的pthread_create
調用。
pthread_create(&t[0], NULL, &double_number, (void *) & Firststruct);
應該
pthread_create(&t[0], NULL, &double_number, (void *) Firststruct);
事實上Firststruct
已經是struct Params
上的指針,額外的&
導致混亂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.