В настоящее время я учусь, как использовать и реализовать boost :: asio.Я следовал учебному пособию на gamedev.net по адресу "https://www.gamedev.net/blogs/entry/2249317-a-guide-to-getting-started-with-boostasio/"
. В этом учебном пособии представлен следующий код:
#include <iostream>
#include "/usr/include/boost/asio.hpp"
#include "/usr/include/boost/thread.hpp"
#include "/usr/include/boost/lexical_cast.hpp"
boost::mutex global_stream_lock;
void WorkerThread( boost::shared_ptr< boost::asio::io_service > io_service )
{
global_stream_lock.lock();
std::cout << "[" << boost::this_thread::get_id() << "] Thread Start" << std::endl;
global_stream_lock.unlock();
io_service->run();
global_stream_lock.lock();
std::cout << "[" << boost::this_thread::get_id() << "] Thread Finish" << std::endl;
global_stream_lock.unlock();
}
void PrintNum( int x )
{
std::cout << "[" << boost::this_thread::get_id() << "] x: " << x << std::endl;
}
int main( int argc, char * argv[] )
{
boost::shared_ptr< boost::asio::io_service > io_service(
new boost::asio::io_service
);
boost::shared_ptr< boost::asio::io_service::work > work(
new boost::asio::io_service::work( *io_service )
);
boost::asio::io_service::strand strand (*io_service);
global_stream_lock.lock();
std::cout << "[" << boost::this_thread::get_id()
<< "] The program will exit when all work has finished." << std::endl;
global_stream_lock.unlock();
boost::thread_group worker_threads;
for( int x = 0; x < 2; ++x )
{
worker_threads.create_thread( boost::bind( &WorkerThread, io_service ) );
}
boost::this_thread::sleep( boost::posix_time::milliseconds( 1000 ) );
strand.post( boost::bind( &PrintNum, 1 ) );
strand.post( boost::bind( &PrintNum, 2 ) );
strand.post( boost::bind( &PrintNum, 3 ) );
strand.post( boost::bind( &PrintNum, 4 ) );
strand.post( boost::bind( &PrintNum, 5 ) );
work.reset();
worker_threads.join_all();
return 0;
}
Мой вывод при выполнении кода выше:
[7fef17715000] The program will exit when all work has finished.
[7fef15897700] Thread Start
[7fef16098700] Thread Start
[7fef15897700] x: 1
[7fef15897700] x: 2
[7fef15897700] x: 3
[7fef15897700] x: 4
[7fef15897700] x: 5
[7fef15897700] Thread Finish
[7fef16098700] Thread Finish
Моя проблема в том, что в приведенном выше коде используется только thread_id 7fef15897700, а 7fef16098700 никогда не используется. В учебном примере выходные данные выглядят следующим образом:
[00154F88] The program will exit when all work has finished.
[001532B0] Thread Start
[00154FB0] Thread Start
[001532B0] x: 1
[00154FB0] x: 2
[001532B0] x: 3
[00154FB0] x: 4
[001532B0] x: 5
[00154FB0] Thread Finish
[001532B0] Thread Finish
Я использую libboost 1.66, которыйbuild был построен следующим образом:
./bootstrap.sh --prefix=/usr
./b2 install threading=multi
Я использую Debian, как показано ниже:
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
И "lscpu |grep -i cpu "output:
CPU op-mode(s): 32-bit, 64-bit
CPU(s): 4
On-line CPU(s) list: 0-3
CPU family: 6
Model name: Intel(R) Core(TM) i5 CPU 650 @ 3.20GHz
CPU MHz: 1197.000
CPU max MHz: 3193.0000
CPU min MHz: 1197.0000
NUMA node0 CPU(s): 0-3
Как получить код для использования всех доступных потоков в группе нитей?
Спасибо за любую помощь или комментарии.