Почему этот простой пример std:: thread не работает?
Пробовал следующий пример, скомпилированный с помощью g++ -std=gnu++0x t1.cpp
и g++ -std=c++0x t1.cpp
, но оба они приводят к прерыванию примера.
$ ./a.out
terminate called after throwing an instance of 'std::system_error'
what():
Aborted
Вот пример:
#include <thread>
#include <iostream>
void doSomeWork( void )
{
std::cout << "hello from thread..." << std::endl;
return;
}
int main( int argc, char *argv[] )
{
std::thread t( doSomeWork );
t.join();
return 0;
}
Я пытаюсь это сделать на Ubuntu 11.04:
$ g++ --version
g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
Кто-нибудь знает, что я пропустил?
Ответы
Ответ 1
Вам нужно join
std::thread
s, так же как вам нужно присоединиться к pthreads
.
int main( int argc, char *argv[] )
{
std::thread t( doSomeWork );
t.join();
return 0;
}
ОБНОВЛЕНИЕ: Этот отчет об ошибке в Debian указал мне на решение: добавьте -pthread
в свою командную строку. Скорее всего, это обходной путь до тех пор, пока код std::thread
не стабилизируется, и g++ вытаскивает эту библиотеку, когда она должна (или всегда, для С++).
Ответ 2
Пожалуйста, используйте библиотеку pthread во время компиляции: g++ -lpthread.
Ответ 3
Простейший код для воспроизведения этой ошибки и как исправить:
Поместите это в файл с именем s.cpp:
#include <iostream>
#include <stdlib.h>
#include <string>
#include <unistd.h>
#include <thread>
using namespace std;
void task1(std::string msg){
cout << "task1 says: " << msg;
}
int main(){
std::thread t1(task1, "hello");
usleep(1000000);
t1.detach();
}
Скомпилируйте вот так:
[email protected]:~/foo7$ g++ -o s s.cpp -std=c++0x
Запустить его так: ошибка:
[email protected]:~/foo7$ ./s
terminate called after throwing an instance of 'std::system_error'
what(): Operation not permitted
Aborted (core dumped)
Чтобы исправить это, скомпилируйте его следующим образом с помощью флага -pthread:
g++ -o s s.cpp -std=c++0x -pthread
./s
Затем он работает правильно:
task1 says: hello
Ответ 4
Для чего я имел другую проблему с похожим кодом с помощью потоков в g++ (MinGW), Обходной процесс заключался в том, чтобы поместить некоторую "задержку" между созданием потока и присоединением к нему.
Код с нередко неудачным утверждением:
std::atomic_bool flag{false};
std::thread worker( [&] () { flag.store(true); } );
worker.join();
assert(flag.load()); // Sometimes fails
Работа вокруг:
std::atomic_bool flag{false};
std::thread worker( [&] () { flag.store(true); } );
while (not flag.load()) { std::this_thread::yield(); }
worker.join();
assert(flag.load()); // Works fine
Обратите внимание, что yield()
самостоятельно не помогло, следовательно, цикл while. Использование sleep_for(...)
также работает.
Ответ 5
Вам нужно установить ссылку на библиотеку времени выполнения