簡體   English   中英

試圖理解涉及結構的多線程。 獲取輸出“分段錯誤(核心轉儲)”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM