【发布时间】:2015-04-27 11:50:25
【问题描述】:
经过几天痛苦的调试,我可以用这个小程序在我的一个单元测试中重现一个错误:
#include <iostream>
#include <vector>
#include <condition_variable>
#include <mutex>
#include <thread>
#include <chrono>
#include <new>
int main(){
try{
for(size_t j=0;j<100;++j){
std::cout<<j<<std::endl;
std::mutex mutex;
std::unique_ptr<std::condition_variable>cv;
std::vector<std::thread>v(10);
auto wait=[&](size_t i){
std::unique_lock<std::mutex>ul(mutex);
if(!cv){cv=std::make_unique<std::condition_variable>();}
cv->wait_for(ul,std::chrono::milliseconds(i*10));
};
for(size_t i=0;i<v.size();++i){v[i]=std::thread(wait,i);}
for(size_t i=0;i<v.size();++i){v[i].join();}}}
catch(...){
std::cout<<"Exception"<<std::endl;
std::abort();}
}
当我使用 lmcheck 进行编译时:
g++-4.9.2 -lmcheck -std=c++1y -pthread /home/Arnaud/Test.cpp -o Test
程序以memory clobbered before allocated block运行和停止
我可以在多台机器上重现这个,并且都使用 gcc 4.9.2 和 gcc 5.1。 这段代码有什么问题?
注意:此代码在 Visual Studio 2013 中运行良好。
【问题讨论】:
-
我猜这是因为
mcheck不是线程安全的:gnu.org/software/libc/manual/html_node/… -
是的,它不是线程安全的。
-
@MikeSeymour:谢谢。你应该写一个小答案。我会接受的。
标签: c++ multithreading gcc memory-management