我有一個相當基本的問題,並不確定它來自哪裏:在併發環境中的lambda捕獲評估或濫用boost文件系統庫。
這是示例代碼:用lambda捕獲本地變量啓動C++ 11線程
#include <iostream>
#include <vector>
#include <thread>
#include <boost/filesystem.hpp>
using namespace std;
using namespace boost::filesystem;
void query(const string filename)
{
cout << filename << " ";
}
int main() {
path p("./");
vector<thread> thrs;
for(auto file = directory_iterator(p); file != directory_iterator(); ++file)
{
thread th([file] {query(file->path().string());});
thrs.push_back(move(th));
}
for (auto& t : thrs)
t.join();
return 0;
}
它在運行時得到:
:~/workspace/sandbox/Release$ l
main.o makefile objects.mk sandbox* sources.mk subdir.mk
:~/workspace/sandbox/Release$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/a/custom-libs/boost-1_59/lib/ ./sandbox
./subdir.mk ./sources.mk ./sandbox ./objects.mk ./main.o ./main.o
通知的競爭條件 - 不是所有的文件最終會被傳遞給線程函數(在此運行生成文件缺失)。
我能找到在一個局部變量中提取參數,改寫循環體作爲一種解決方法:
auto fn = file->path().string();
thread th([fn] {query(fn);});
thrs.push_back(move(th));
在哪裏競爭條件是從哪裏來的?
是不是file-> path()。string()在創建線程時是否正確?
所有這些線程同時使用std :: cout ... – kfsone