2

私は2スレッド配列合計プログラムを作成中であり、windows.hスレッドを使用しています。そして、これは私がこれまでに持っているコードです。

#include "StdAfx.h"
#include <stdio.h>
#include <iostream>
#include <windows.h>
#include <process.h>     // needed for _beginthread()

void  silly( void * );   // function prototype

using namespace std;

int arraySum[100];

int main()
{
    // Our program's first thread starts in the main() function.

    printf( "Now in the main() function.\n" );


    for(int i = 0 ; i  < 100 ; i++){
        arraySum[i] = i;
    }

    // Let's now create our second thread and ask it to start
    // in the silly() function.


    _beginthread( silly, 0, (void*)1 );
    _beginthread( silly, 0, (void*)2 );

    Sleep( 100 );

    int a;
    cin >> a;

}

void  silly( void *arg )
{
    printf( "The silly() function was passed %d\n", (INT_PTR)arg ) ;
    int partialSum = 0;
    for(int i =50*((INT_PTR)arg - 1); i < 50 * ((INT_PTR)arg) ; i++){
    partialSum == arraySum[i];
    }
}

私が難しいと思うのは、関数に分割合計をmainメソッドに返すようにすることです。誰かが私を助けてくれませんか。

4

3 に答える 3

6

intのアドレスをに渡しますsilly()。これは、入力パラメーターと出力パラメーターの両方として機能silly()し、呼び出し元が必要とする値を入力します。

int silly_result_1 = 1;
int silly_result_2 = 2;

_beginthread( silly, 0, (void*)&silly_result_1 );
_beginthread( silly, 0, (void*)&silly_result_2 );

void silly( void *a_arg )
{
    int* arg = (int*) a_arg;
}

2つのスレッドが完了するのを待つ必要があります。


アドレスが渡される変数_beginthread()は、スレッドの存続期間中存在する必要があることに注意してください。たとえば、次の場合、未定義の動作が発生します。

void _start_my_thread()
{
    int silly_result = 2;
    _beginthread( silly, 0, (void*)&silly_result );
} /* 'silly_result' is out of scope but still used by the thread. */

これは、変数にメモリを動的に割り当てることで解決できます(そして、メインスレッドまたは新しいスレッドが割り当てられたメモリを破棄する責任があるかどうかを判断します)。

于 2012-09-26T13:59:35.343 に答える
5

スレッド自体に何かを返すようにすることはできません。代わりに、開始呼び出しで構造体を使用できます。

_beginthread( silly, 0, (void*)1 );

これをに変更すると

typedef struct dataStruct {
    int ID;
    int returnValue;
};

dataStruct thread_1;
thread_1.ID = 1;
thread_1.returnValue = 0;
_beginthread( silly, 0, (void*)&thread_1 );

スレッド内で、必要に応じてreturnValueを設定し、そこから続行できます

于 2012-09-26T13:59:24.093 に答える
0

C ++ 11では、これに先物を使用することができます。

#include <future>
#include <numeric>
#include <iostream>

int arraySum[100];

int partial_sum(int start)
{
    int sum = 0;
    for(int i = start; i < start + 50; ++i)
        sum += arraySum[i];
    return sum;
}

int main()
{
    for(int i = 0 ; i  < 100 ; i++)
    {
        arraySum[i] = i;
    }
    auto a = std::async([]() {return partial_sum(0);});
    auto b = std::async([]() {return partial_sum(50);});
    std::cout << a.get() + b.get() << "\n";
}

std::launch::async起動ポリシーをに渡して、std::asyncスレッドの作成を強制したい場合があります。

于 2012-09-26T14:26:17.433 に答える