2

t スレッドを使用して、0 から n までの数値を合計する C++ プログラムがあります。N と T は、コマンド ライン引数として渡されます。pthreads を作成する for ループと、メインをそれらに再結合する 2 番目の for ループを使用しています。使用するスレッドが 11 または 12 未満の場合、プログラムは正常に実行されます。たとえば、入力 100 10 では、5050 が返されます。11 ~ 12 を超えるスレッドを使用すると、セグメンテーション フォールトが発生してクラッシュします。理由がわからないようです。コードには、プロンプトへの出力など、デバッグに使用していた行がいくつかあります。ヒントをいただければ幸いです。

int n = 0;
int t = 0;
unsigned long gsum = 0;
pthread_mutex_t mutexsum;

void *sum(void *Index)
{
    int index = (int)(int *) Index; 
    int threadSum = 0;
    int k;
    int lowerBound, upperBound; //used to find range of numbers to sum

    //printf("I am here: %d \n",index);

    if (index == t - 1) {
        lowerBound = (n/t)*(t-1);
        upperBound = n; 
    } else {
        lowerBound = (n/t)*index;
        upperBound = (n/t)*(index+1)-1;
    }

    for (k = lowerBound; k < upperBound + 1; k++) {
        threadSum = threadSum + k;
    }

    // Critical Section
    pthread_mutex_lock(&mutexsum);
    gsum = gsum + threadSum;
    pthread_mutex_unlock(&mutexsum);    

    pthread_exit((void*) 0);
}
int main(int argc, char* argv[]){
int i, k, j;
pthread_t sumThreads [t];


for(i = 1; i < argc; i++) {
    if(i == 1)
        n = atoi(argv[i]);
    if(i == 2)
        t = atoi(argv[i]);
}

if (n < 0 || t <= 0 || argc != 3) {
    printf("Invalid or missing parameters! \n");
    exit(0); 
}

for (k = 0; k < t; k++) {
    int nt = -1;    
    nt = pthread_create(&sumThreads[k], NULL, sum, (void*)k);
    printf("%d \n", nt);
}

for (j = 0; j < t; j++) {
    int rj = -1;    
    rj = pthread_join (sumThreads[j], NULL);
    printf("%d \n", rj);
}    

printf("Total Sum: %lu \n",gsum);
return 0;
4

2 に答える 2

3

tプログラムの先頭でゼロに初期化されているので、次の行になります。

pthread_t sumThreads [t];

スレッド識別子を保持するのに十分な大きさの配列を割り当てていません。したがって、識別子を格納するときにバッファオーバーランが発生し、thread_joinループ内のバッファを超えて読み取りを行っています。

可変長配列(またはVLA)と呼ばれる機能を使用しています。これは、1999年の標準改訂でC言語の一部になりました。C ++はVLAを採用していないため、コンパイラ拡張を使用しています。コードをC++に準拠させたい場合は、代わりにベクトルを使用する必要があります。

std::vector<pthread_t> sumThreads;

// ...after t gets initialized
sumThreads.resize(t);
于 2012-06-18T17:10:38.927 に答える
0

c/c++ では、このタイプのコードは機能しません。

int i=10:
int arr[i];

これは避けてください。このタイプのコードが有効であれば、malloc. は必要ありません。これはまさにあなたが達成しようとしていることです。

于 2012-06-18T17:17:58.713 に答える