ネタ元 → インテル スレッディング・ビルディング・ブロックの概要
マルチスレッドのホントに単純なサンプルが載ってるんですけどね、
なんかこー、すっげーまだるっこいのよ。
僕ならこう書くよ?
/* thread.cpp : グローバル変数の値を複数のスレッドから変更します。
* cl -EHsc -MD thread.cpp
*/
#include <iostream>
#include <windows.h>
long global = 100;
//グローバル変数の値を増加します
DWORD WINAPI AddThreadFunc(void* pvParam) {
int value = *static_cast<int*>(pvParam);
InterlockedExchangeAdd(&global, value); //ここに注意
return 0;
}
//グローバル変数の値を減算します
DWORD WINAPI SubThreadFunc(void* pvParam) {
int value = *static_cast<int*>(pvParam);
InterlockedExchangeAdd(&global, -value); //ここに注意
return 0;
}
int main() {
std::cout << "グローバル変数の初期値=" << global << std::endl;
int value = 10;
// ふたつのスレッドを生成する
HANDLE hThreads[] = {
CreateThread(0,0,&AddThreadFunc,&value,0,0),
CreateThread(0,0,&SubThreadFunc,&value,0,0)
};
// 両スレッドの終了を待つ
WaitForMultipleObjects(2, hThreads, TRUE, INFINITE);
// あとしまつ
CloseHandle(hThreads[0]);
CloseHandle(hThreads[1]);
std::cout << "グローバル変数の最終値=" << global << std::endl;
}