我目前在单线程应用程序中运行来自其他人库的函数Foo.大多数时候,我打电话给Foo并且它很快,有时候,我打电话给Foo并且它需要永远.我不是一个耐心的人,如果Foo要永远服用,我想停止执行Foo而不是用这些参数调用它.
以受控方式调用Foo的最佳方法是什么(我当前的环境是POSIX/C++),这样我可以在一定的秒数后停止执行.我觉得在这里做正确的事情就是创建第二个线程来调用Foo,而在我的主线程中我创建了一个计时器函数,如果它没有时间,它最终将发出第二个线程的信号.
还有另一个更贴切的模型(和解决方案)吗?如果没有,Boost的Signals2库和Threads会不会这样做?
我有一个项目列表,我需要在不同的时间间隔更新.该列表可以长达数千个项目.每个项目可能具有不同的间隔.如果我为每个项目创建一个计时器,我是否会使用线程使系统饱和?我认为最好创建一个等于项目集中最小间隔的计时器,然后在每次更新时增加一个计数器,然后检查计数器现在是否等于任何其他间隔.如果最小间隔是所有其他间隔的倍数,则应该起作用.有什么建议?
(这个问题虽然相似,但并没有真正回答我的问题.)
我在自己的"线程组"实现方面遇到了问题,并且没有更接近解决甚至找出问题,我正在考虑使用boost::thread_grp.
现在,根据我在主题1 上可以找到的文档,我一直认为线程对象 - 无论其实际工作的持续时间 - 仍然存在并且是线程组的一部分,直到线程组被销毁.
但是,粗略的测试似乎表明,boost::thread_group::size()当线程完成其工作并终止时,它自己会减少.这意味着线程对象本身也正在为我清理.
这是真的?我可以依靠它吗?
#include <cassert>
#include <unistd.h> // for sleep()
#include <boost/thread.hpp>
boost::mutex m;
unsigned int count = 0;
void func() {
boost::mutex::scoped_lock l(m);
count++;
}
int main()
{
boost::thread_group grp;
for (size_t i = 0; i < 300; i++)
grp.create_thread(func());
sleep(10);
assert(count == 300);
assert(grp.size() == 0); // passes, in my tests
// ^ Can I rely on that? …Run Code Online (Sandbox Code Playgroud) 我是Boost.Threads的新手,我正在尝试理解如何将函数参数传递给boost::thread_groups::create_thread()函数.在阅读了一些教程和boost文档之后,我明白可以简单地将参数传递给这个函数,但是我无法使这个方法起作用.
我读到的另一个方法是使用函子将参数绑定到我的函数但是会创建参数的副本,我严格要求传递const引用,因为参数将是大矩阵(我计划通过使用boost::cref(Matrix)一次我得到这个简单的例子来工作).
现在,让我们来看看代码:
void printPower(float b, float e)
{
cout<<b<<"\t"<<e<<"\t"<<pow(b,e)<<endl;
boost::this_thread::yield();
return;
}
void thr_main()
{
boost::progress_timer timer;
boost::thread_group threads;
for (float e=0.; e<20.; e++)
{
float b=2.;
threads.create_thread(&printPower,b,e);
}
threads.join_all();
cout << "Threads Done" << endl;
}
Run Code Online (Sandbox Code Playgroud)
这不会编译与以下错误:
mt.cc: In function âvoid thr_main()â:
mt.cc:46: error: no matching function for call to âboost::thread_group::create_thread(void (*)(float, float), float&, float&)â
/usr/local/boost_1_44_0/include/boost/thread/detail/thread.hpp: In member function âvoid boost::detail::thread_data<F>::run() [with F = void (*)(float, float)]â:
mt.cc:55: instantiated from here
/usr/local/boost_1_44_0/include/boost/thread/detail/thread.hpp:61: …Run Code Online (Sandbox Code Playgroud) 关于C/C++中线程的问题......
C++ 0x语法
#include <thread>
void dummy() {}
int main(int, char*[]) {
std::thread x(dummy);
std::thread y(dummy);
...
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有多少线程?两个(x和y)或三个(x,y和main)?我可以打电话给this_thread::yield()主?我this_thread::get_id()在主要电话中得到什么?
pthread语法
#include <pthread.h>
void dummy() {}
int main(int, char*[]) {
pthread_t x, y;
pthread_create(&x, NULL, &dummy, NULL);
pthread_create(&y, NULL, &dummy, NULL);
...
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有多少线程?两个(x和y)或三个(x,y和main)?我可以打电话给pthread_yield()主?我pthread_self()在主要电话中得到什么?
提升语法
#include <boost/thread>
void dummy() {}
int main(int, char*[]) {
boost::thread x(dummy);
boost::thread y(dummy);
...
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有多少线程?两个(x和y)或三个(x,y和main)?我可以打电话给boost::this_thread::yield()主?我boost::this_thread::get_id()在主要电话中得到什么?
boost::this_thread::sleep()似乎使用的对象的例子boost::posix_time::milliseconds.我已经尝试了它并且它可以工作,但我boost::chrono用于检查系统时钟等.在我看来,我应该能够通过sleep()一个chrono::duration这样的:
boost :: this_thread :: sleep(boost :: chrono :: duration(10));
但是编译器给出了以下错误:
... boost_1_49_0\boost/thread/win32/thread_data.hpp(171):错误C2039:'total_milliseconds':不是'boost :: chrono :: duration'的成员
我发现这令人困惑.我是否正确地认为我应该能够做到这一点?是否有必要转换为posix_time?
在我的应用程序中,我通常想要拦截SIGINT和SIGTERM发出信号以便优雅地关闭.
为了防止工作线程"窃取"信号,我在每个的入口点执行此操作:
// Block signals in this thread
sigset_t signal_set;
sigaddset(&signal_set, SIGINT);
sigaddset(&signal_set, SIGTERM);
sigaddset(&signal_set, SIGHUP);
sigaddset(&signal_set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &signal_set, NULL);
Run Code Online (Sandbox Code Playgroud)
如果我没有,当我执行Ctrl+时C,有些时候(未指定哪个线程将获得信号)我的基本线程中的处理程序将不会被调用 - 相反,信号只是从内部终止进程工人线程.这显然不酷.
所以我在其他地方有一个信号处理线程和阻塞信号.
但是,我没有注意到其他任何人这样做,忘记这样做很容易,而且它也不是完全可移植的.是否有一些我想念的更简单的技巧?
参考文献:
我正在尝试使用boost :: thread将C++ 11 std :: thread代码移植到VC9(VS 2008).下面的'等效'C++ 11代码在msvc12上编译得很好:
#include <iostream>
#include <thread>
#include <vector>
#include <algorithm>
#include <cassert>
void thFun(int i)
{
std::cout << "Hello from thread " << i << " !\n";
}
int main()
{
std::vector<std::thread> workers;
for (int i = 0; i < 10; ++i)
{
auto th = std::thread(&thFun, i);
workers.push_back(std::move(th));
assert(!th.joinable());
}
std::cout << "Hello from main!\n";
std::for_each(workers.begin(), workers.end(), [](std::thread& th)
{
assert(th.joinable());
th.join();
});
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想使用msvc9编译器和Boost 1.55将代码移植到C++ 03.如何解决以下编译错误:
#include <iostream>
#include …Run Code Online (Sandbox Code Playgroud) 我想尝试提升未来,我已经安装了1.55并包含在make文件中,我想尝试官方演示
#define BOOST_THREAD_PROVIDES_FUTURE
#include <boost/thread/future.hpp>
using namespace boost;
int main()
{
future<int> f1 = async([]() { return 123; });
future<int> f2 = f1.then([](future<int> f) { return f.get();} );// here .get() won't block });
}
Run Code Online (Sandbox Code Playgroud)
但我在编译期间总是遇到错误
error: ‘class boost::future<int>’ has no member named ‘then’
Run Code Online (Sandbox Code Playgroud)
当我用f2评论它时,它编译.
boost-thread ×10
c++ ×10
boost ×5
pthreads ×2
boost-asio ×1
boost-move ×1
c++-chrono ×1
c++11 ×1
timer ×1
visual-c++ ×1
watchdog ×1