0

これが私が持っているコードです。g++を使用してコンパイルおよび実行されますが、セグメンテーション違反が発生します。pthread_joinステートメントの周りで発生することは知っていますが、その理由がわかりません。

#include <iostream>
#include <stdio.h>
#include <fstream>
#include <pthread.h>
#include <stdlib.h>
#include <sstream>

using namespace std;

struct data{
    string filename;
    int x;
    int y;
};

void *threadFunction(void *input){
    data *file = (data *) input;
    string filename = file->filename;
    ifstream myFile;
    int xCount = 0;
    int yCount = 0;
    myFile.open(filename.c_str());
    string line;
    while(myFile >> line){
        if(line == "X"){
            xCount++;
        }else if(line == "Y"){
            yCount++;
        }
    }
    file->x = xCount;
    file->y = yCount;
    return (void *) file;
}

int main(){
    pthread_t myThreads[20];
    data *myData = new data[20];

    for(int i = 0; i < 20; i++){
        ostringstream names;
        names << "/filepath/input" << i+1 << ".txt";
        myData[i].filename = names.str();
        myData[i].x = 0;
        myData[i].y = 0;
    }
    for(int i = 0; i < 20; i++){
        int check = pthread_create(&myThreads[i], NULL, threadFunction, (void *) &myData[i]);
        if(check != 0){
            cout << "Error Creating Thread\n";
            exit(-1);
        }
    }



    int xCount = 0;
    int yCount = 0;

    for(int i = 0; i < 20; i++){
        data* returnedItem;
        pthread_join(myThreads[i], (void**) returnedItem);
        xCount += returnedItem->x;
        yCount += returnedItem->y;
    }

    cout << "Total X: " << xCount << "\n";
    cout << "Total Y: " << yCount << "\n";

}

threadFunctionからreturnを正しく呼び出していませんか?私はさまざまなことを試してきましたが、何が起こっているのかまだわかりません...どんな助けでも大歓迎です!(開いたテキストファイルには、1行にXまたはYが含まれています。私の目標は、20個のテキストファイルのXとYの総数をカウントすることです)

4

3 に答える 3

0
pthread_join(myThreads[i], (void**) returnedItem);

する必要があります

pthread_join(myThreads[i], (void**) &returnedItem);

returnedItemスレッド関数が返す値を設定するようにjoinに要求しているので、アドレスを指定void*する必要があります。returnedItem

于 2012-10-21T23:09:02.423 に答える
0

の2番目の引数pthread_join()void**、結果が格納されるになります。ただし、ランダムな値を渡しています。これはむしろ次のようになります。

void* result;
pthread_join(myThread[i], &result);
data* returnedItem = static_cast<data*>(result);

もちろん、これはadata*が実際に返されたことを前提としています。

于 2012-10-21T23:09:26.890 に答える
0

の2番目の引数はpthread_join、スレッドの戻り値を返すために使用されるため、内部のどこかにpthread_joinを呼び出すコードがあり*secondArgument = thread_return_valueますが、ここで何をしているのかを見てみましょう。

// You are not initializing returnedItem, so it contain some garbage value
// For example 0x12345678
data* returnedItem;
// Now you cast that garbage to (void**), and pthread_join will call
// *(0x12345678) = thread_return_value that will cause segmentation fault
pthread_join(myThreads[i], (void**) returnedItem);

しかし、戻り値をコピーしたいのですがreturnedItem、私は正しいですか?「はい」と答えた場合は、のアドレスを渡しreturnedItempthread_join、そこにコピーできるようにする必要があります。したがって、呼び出しを次のように変更します。

pthread_join(myThreads[i], (void**) &returnedItem);
于 2012-10-21T23:12:25.100 に答える