Какие флаги необходимо расставить для компилятора g++(к примеру) в системе cmake(к примеру), чтобы он скомпилировал и собрал программу с потоками?
Пожалуйста подскажите. Программу необходимо скомпилировать так, чтобы не появлялись ошибки компиляции и линковки, связанные с "undefined reference" и тд, при самых простых образцах кода, использующего
(1) Для программы, использующей std::thread в своём коде. Компилятор g++, под Linux(Вопрос для уточнения, не сильно важный).
(2) Для программы, использующей boost::thread. Компилятор также g++, под Linux.
Хочется раз и навсегда уточнить эти вопросы. И дополнительно есть ещё третий вопрос по этой теме, но связанный скорее с ошибками выполнения.
(3) Дело в том что при запуске простой программы на конкретной плате при компиляторе g++-arm-linux-gnueabi с флагами " -Wall --static -marm -march=armv5tej -std=c++17 -pthread" программа со следующим кодом выполняется(однако как минимум одна итерация цикла функции TimeOutWork успевает выполниться) с ошибкой(terminated called after throwning an instance of 'std::system_error'). Какие могут быть ошибки в данном коде, которые приводят к этому(программа тестовая, на стандартном компиляторе запускается и работает без ошибок каких-либо)?:
std::atomic<bool> runStatus = true;
std::atomic<bool> waitStatus = false;
void Constole()
{
std::string cmd;
while(runStatus)
{
waitStatus = true;
std::cin >> cmd;
if(cmd == "stop")
{
runStatus = false;
break;
}
waitStatus = false;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
void TimeOutWork()
{
while(runStatus)
{
if(!waitStatus)
{
std::cout << " I am here!" << std::endl;
}
std::this_thread::sleep_for(std::chrono::milliseconds(40));
}
}
int main()
{
std::thread consoleThread(Constole);
std::thread workThread(TimeOutWork);
consoleThread.join();
workThread.join();
return 0;
}
Ответы (3 шт):
Раз уж хочется буста (но это такое), то можно сделать вот так. Вначале исправим main.cpp
#include <iostream>
#include <boost/thread.hpp>
#include <boost/chrono.hpp>
#include <atomic>
std::atomic<bool> runStatus{true};
std::atomic<bool> waitStatus{false};
void Constole()
{
std::string cmd;
while(runStatus)
{
waitStatus = true;
std::cin >> cmd;
if(cmd == "stop")
{
runStatus = false;
break;
}
waitStatus = false;
boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
}
}
void TimeOutWork()
{
while(runStatus)
{
if(!waitStatus)
{
std::cout << " I am here!" << std::endl;
}
boost::this_thread::sleep_for(boost::chrono::milliseconds(40));
}
}
int main()
{
boost::thread consoleThread(Constole);
boost::thread workThread(TimeOutWork);
consoleThread.join();
workThread.join();
return 0;
}
И напишем вот такой CMakeLists.txt
cmake_minimum_required(VERSION 3.1)
project(test)
find_package(Threads REQUIRED)
find_package(Boost COMPONENTS thread chrono system REQUIRED)
add_executable(test main.cpp)
target_link_libraries(test Boost::thread Boost::chrono)
все компилится и работает. Если нужна поддержка кросскомпиляции - тут нужно применять подходящие тулчейны.
Чтобы проект использующий boost::thread и boost::chrono(опционально) скомпилировался необходимо в системе CMake указать следующий код:
cmake_minimum_required(VERSION 3.14)
project(test)
set(CMAKE_CXX_STANDARD 11)
find_package(Threads REQUIRED)
set(SOURCE_FILES main.cpp)
find_package(Boost COMPONENTS thread chrono system REQUIRED)
add_executable(test ${SOURCE_FILES})
include_directories(${Boost_INCLUDE_DIR})
target_link_libraries(test ${Boost_LIBRARIES})
Проверялось только на коде, что указан выше.
(2) Проблема того что std-потоки не работали, крылась в том что были некорректно сконфигурированы файлы процессора, при прошивке. Из-за чего при обращении к нужным инструкциям вылетали ошибки, а операционная система завершала свою работу. Теперь std-потоки работают.
(3) Для компиляции программы с использованием boost-потоков необходимо самому скомпилировать исходный код этих потоков, под конкретную процессорную архитектуру.
Так что теперь вопрос можно окончательно закрыть.