std::threadを何とか使う。
とりあえず動いた。配列はvectorに置換して。
#include <iostream>
#include <thread>
#include <vector>
#include <string>
#include "clMatrix.hpp"
template<typename T>
void fcShow(T data) {std::cout << data ;}
template<typename T, typename K>
void fcThreadWork_xxx(T& tA, T& tB,int iSf,int iEf) {
for(int i=iSf;i<iEf;++i){
K tmp;
tmp = tA(i);
tA(i) = tB(i);
tB(i) = tmp;
//std::swap(tA(i),tB(i));
}
}
template<typename T>
void fcDump(string str,T& tX) {
fcShow(str);
int iSize = tX.fcGetSize();
for (int i = 0; i < iSize; ++i) {
fcShow(tX(i));
fcShow(",");
}
fcShow("\n");
}
int main()
{
int hoge = 100;
const int iSize = hoge;
mtd::clVector<double>dA(iSize); mtd::clVector<double>dB(iSize);
for (int i = 0; i < iSize; ++i) {dA(i) = i;dB(i) = i * -10;}
fcShow("■ ■ ■ ナイーブに交換 前 ■ ■ ■\n");
fcDump("dA:",dA); fcDump("dB:", dB);
const double dThreadNumRatio = 0.5;
int iThreadNum = (int)((double)std::thread::hardware_concurrency() * dThreadNumRatio);
if (iThreadNum == 0) { iThreadNum = 2; }
int iStep = (int)((double)iSize / (double)iThreadNum);
std::vector<std::thread> obThreads(iThreadNum);
// スレッドを生成
for (int i = 0; i < iThreadNum; ++i) {
int iS = 0, iE = 0;
iS = i * iStep;
if (i < iThreadNum -1) {
iE = iS + iStep;
} else {
iE = iSize;
}
obThreads[i] = (std::thread(fcThreadWork_xxx<mtd::clVector<double>,double>, std::ref(dA), std::ref(dB), iS, iE));
//threads.push_back(std::thread(fcSwapThWork, std::ref(dA), std::ref(dB), iS, iE));
}
// 各スレッドの終了を待つ
for (auto& t : obThreads) {
t.join();
}
fcShow("■ ■ ■ ナイーブに交換 後 ■ ■ ■\n");
fcDump("dA:", dA); fcDump("dB:", dB);
std::cout << "Hello World!\n";
}
引用 google で std::thread を検索。そのウェブページ