Почему этот простой пример std :: thread не работает? - PullRequest
44 голосов
/ 26 июня 2011

Попробовал следующий пример, скомпилированный с 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;
}

Iпробую это на Ubuntu 11.04:

$ g++ --version
g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2

Кто-нибудь знает, что я пропустил?

Ответы [ 5 ]

45 голосов
/ 26 июня 2011

Вам нужно join std::thread с, точно так же, как вы должны присоединиться pthreads.

int main( int argc, char *argv[] )
{
    std::thread t( doSomeWork );
    t.join();
    return 0;
}

ОБНОВЛЕНИЕ: Этот отчет об ошибках Debian указал мне на решение: добавьте -pthread к вашей командной строке.Скорее всего, это обходной путь до тех пор, пока код std::thread не стабилизируется и g ++ не вытянет эту библиотеку, когда это необходимо (или всегда для C ++).

13 голосов
/ 15 августа 2012

Пожалуйста, используйте библиотеку pthread во время компиляции: g ++ -lpthread.

3 голосов
/ 09 апреля 2014

Простейший код для воспроизведения этой ошибки и способы ее исправления:

Поместите это в файл с именем 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();
}

Скомпилируйте так:

el@apollo:~/foo7$ g++ -o s s.cpp -std=c++0x

Запустите это так, ошибка происходит:

el@apollo:~/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
0 голосов
/ 23 сентября 2015

Для чего бы это ни стоило, у меня была другая проблема с аналогичным кодом с использованием потоков в 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(...) также работает.

0 голосов
/ 17 мая 2012

Вам нужна ссылка для запуска библиотеки времени

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...