草庐IT

thread-bound

全部标签

c++ - 使用 boost::thread::interrupt() 时,您*需要*捕获 thread_interrupted 异常吗?

我有几个长时间运行的boost线程,我希望能够通过中断它们来关闭它们。我能找到的所有文档都说您可以捕获thread_interrupted异常,但它并没有真正说明如果您不这样做会发生什么。我会假设它会杀死线程(并希望线程得到正确清理)。但是异常会随着线程消失吗?或者它会被传递到主线程并杀死它吗? 最佳答案 异常与任何其他C++异常一样。如果您选择不捕获它,它会导致与任何其他未处理的异常相同的效果。如果未被捕获,它不会传播到主线程,但可能会导致其他不良行为。在VisualC++上,默认情况下这将是terminateyourproces

c++ - std::upper_bound 在 const 成员函数中返回 const 迭代器

这是一个类,其中包含一些struct的boost::circular_buffer。我为包含的circular_buffer中的迭代器创建了一个typedef。我的问题是:当doWork函数被标记为const时,std::upper_bound的返回值与MyIterator类型,因为返回值具有boost::cb_details::const_traits。如果我从函数中删除const关键字,我所有的编译错误都会消失。要明确编译器错误是这样的:error:conversionfrom‘boost::cb_details::iterator::Sample,std::allocator::

c++ - std::set,lower_bound 和 upper_bound 是如何工作的?

我有一段简单的代码:#include#includeusingstd::set;intmain(intargc,charargv){setmyset;set::iteratorit_l,it_u;myset.insert(10);it_l=myset.lower_bound(11);it_u=myset.upper_bound(9);std::cout这会打印1作为11的下限,10作为9的上限。我不明白为什么要打印1。我希望使用这两种方法来获取给定上限/下限的一系列值。 最佳答案 来自cppreference.com在std::se

c++ - 如何获取当前线程的std::thread?

如何获得代表当前(已经运行的线程)的std::thread对象。我知道我可以做std::this_thread::get_id()。但是,这会给我一个std::thread:id对象。我的主要目标是让其他线程加入当前线程。但是,问题是当前的不是通过创建std::thread启动的,所以我无法事先保存它。 最佳答案 您无法获得引用不是由std::thread构造函数创建的线程的std::thread对象。要么始终使用C++线程库,要么根本不使用它。例如,如果当前线程是由pthread_create创建的,则需要使用pthread_jo

c++ - g++: array bound 不是整数常量

有了代码,constdoublerotationStep=0.001;constintN=2*int(M_PI/rotationStep)+3;staticunsignedintcounts[N];g++给出错误:arrayboundisnotanintegerconstantbefore»]«token我正在使用g++/gcc版本4.6.1谁能告诉我为什么g++提示这个表达式? 最佳答案 根据2003年的ISOC++标准,这不是整型常量表达式。引用标准第5.19节:Anintegralconstant-expressioncani

c++ - VC++ : Performance drop x20 when more threads than cpus but not under g++

简单的多线程c++11程序,其中所有线程在紧密循环中锁定相同的互斥量。当它使用8个线程时(作为逻辑cpu的数量)可以达到500万锁/秒但是只添加一个额外的线程-性能会下降到200,000/秒!编辑:在g++4.8.2(ubuntux64)下:即使有100个线程,性能也不会下降!(性能是两倍多,但那是另一回事了)-所以这似乎确实是一个特定于VC++互斥实现的问题我用下面的代码(Windows7x64)复制了它:#include#include#include#include#include#include#includeusingnamespacestd::chrono;voidthre

c++ - 带有可移动、不可复制参数的 std::thread

以下程序不在VS11beta、gcc4.5或clang3.1中构建#include#includeintmain(){std::unique_ptrp;std::threadth([](std::unique_ptr){},std::move(p));th.join();}这是因为参数类型不可复制,但实现试图复制它。据我所知,这个程序格式正确,应该可以运行。std::thread的要求似乎暗示可移动的、不可复制的参数应该在这里起作用。具体来说,它表示可调用对象和每个参数应满足MoveConstructible要求,并且INVOKE(DECAY_COPY(std::forward(f))

c++ - '&' : illegal operation on bound member function expression

这个问题在这里已经有了答案:Printaddressofvirtualmemberfunction(5个答案)关闭7年前。当我尝试从具有主要功能的单个cpp文件时,这有效,sprintf(smem_options,"#transcode{vcodec=RV24}:smem{""video-prerender-callback=%lld,""no-time-sync},",(longlongint)(intptr_t)(void*)&cbVideoPrerender);如何在类中将函数参数传递给sprintf?sprintf(smem_options,"#transcode{vcodec

c++ - boost::thread - 简单示例不起作用 (C++)

为了开始使用boost::thread,我编写了一个非常简单的示例——它不起作用。谁能指出我的错误?我写了一个非常简单的仿函数类型的类来完成这项工作。它应该计算doublestd::vector的总和,并给我一种稍后获取结果的方法:classSumWorker{private:double_sum;public:SumWorker():_sum(-1.0){}voidoperator()(std::vectorconst&arr){_sum=0.0;for(std::vector::const_iteratori=arr.begin();i!=arr.end();i++){_sum+=

c++ - 'yield' 不是 'std::this_thread' 的成员

我试图让出当前线程:std::this_thread::yield();但不幸的是,GCC知道得更多:'yield'isnotamemberof'std::this_thread'我是否忘记了一些类似于D_GLIBCXX_USE_NANOSLEEP的hack,或者什么? 最佳答案 是的,这似乎是一个类似于_GLIBCXX_USE_NANOSLEEP的问题。GCC根据宏_GLIBCXX_USE_SCHED_YIELD有条件编译yield。如果您定义它,它应该可以编译。这将在GCC4.8中修复。