你可以像pthread一样取消Boost Thread吗?
我正在编写一个简单的监视程序来终止工作线程,如果它们崩溃并且似乎没有办法简单地取消Boost Thread库中的线程.
我和一个朋友正在开发一个使用Boost :: Python的应用程序.我已经在C++中定义了一个接口(很好是一个纯虚拟类),通过Boost :: Python公开给用户,他们必须从中继承并创建一个类,应用程序将其用于某些回调机制.
一切都很顺利.现在,函数回调可能需要一些时间(用户可能已编写了一些重要的东西)...但我们需要重新绘制窗口,因此它看起来并不"卡住".我们想使用Boost :: Thread来实现这一点.一次只能运行一个回调(没有其他线程会同时调用python),所以我们认为它不会那么大......因为我们不在python中使用线程,也不在包装为python的C++代码.
我们所做的是在Py_Initialize()之后调用PyEval_InitThreads(),然后,在调用它自己的boost线程中的函数回调之前,我们使用宏PY_BEGIN_ALLOW_THREADS,并在线程结束时使用宏PY_END_ALLOW_THREADS.
我想我不需要说执行永远不会到达第二个宏.它每次运行时都会显示几个错误...但是在调用实际回调时总是这样.我已经google了很多,甚至阅读了一些关于线程的PEP文档,但是他们都讨论了python模块中的线程(我不认为它只是一个纯粹的虚拟类暴露)或者在python中进行线程化,而不是主要的应用程序从多个线程调用Python.
请帮忙,这让我感到沮丧几个小时.
PS.救命!
我有一个多线程服务器应用程序,需要在某些共享内存上进行互斥锁定.
共享内存基本上是sTL地图等.
很多时候我只是从地图上读书.但是,我还需要偶尔添加它.
例如typedef std :: map MessageMap; MessageMap msgmap; boost:shared_mutex access_;
void ProcessMessage(Message* message)
{
// Access message... read some stuff from it message->...
UUID id = message->GetSessionID();
// Need to obtain a lock here. (shared lock? multiple readers)
// How is that done?
boost::interprocess::scoped_lock(access_);
// Do some readonly stuff with msgmap
MessageMap::iterator it = msgmap.find();
//
// Do some stuff...
// Ok, after all that I decide that I need to add an entry to the map.
// …Run Code Online (Sandbox Code Playgroud) 如果我使用Boost期货,并且未来报告为has_exception(),是否有任何方法可以检索该异常?例如,以下是以下代码:
int do_something() {
...
throw some_exception();
...
}
...
boost::packaged_task task(do_something);
boost::unique_future<int> fi=task.get_future();
boost::thread thread(boost::move(task));
fi.wait();
if (fi.has_exception()) {
boost::rethrow_exception(?????);
}
...
Run Code Online (Sandbox Code Playgroud)
问题是,应该把什么放在"?????"?
我是C++中线程概念的新手.我只是想知道几件事情:如何是boost::unique_lock从不同boost::upgrade_lock?
独家所有权实际上与升级所有权有何不同.
也许可以说独占所有权是线程安全但不是升级所有权,在这种情况下我想知道升级所有权如何可能是有害的?我想知道什么是upgrade_lock允许或
unique_lock不允许除了独占锁定的东西.不提供排他性锁定
upgrade_lock使它类似于shared_lock什么,如果是,那么它与它有什么不同shared_lock?
我对boost :: threads很新,我阅读了文档,但是我在实践中应用它时遇到了一些麻烦,也许你可以帮忙吗?首先,我花时间编写了一个自包含的代码清单,演示了两种我无法理解的行为......
该程序允许用户发出3个不同的命令,
目的是任务将在新线程上启动一些工作,但在执行工作时返回到命令提示符.用户可以使用info命令找出哪些任务已完成,哪些未完成.
我使用双核Win7机器和Visual Studio 2008 Express.
问题1>
发出命令,任务p1 p2 p3,启动3个任务正在运行.这可以通过发布信息来检查.几秒钟后,工作完成,但由于某种原因,完成的标志并不总是在1或2个任务上设置为true.
问题2>
退出程序然后生成以下消息:
Windows在example.exe中触发了断点.这可能是由于堆的损坏,这表示example.exe或它已加载的任何DLL中的错误.这也可能是由于用户在example.exe具有焦点时按下F12.输出窗口可能包含更多诊断信息.
希望您可以重现此行为并提供帮助.
提前致谢.亚历克斯.
//WARNING: THIS CODE DOES NOT BEHAVE EXACTLY AS INTENDED
#include <iostream>
#include <string>
#include <sstream>
#include <boost/thread.hpp>
using namespace std;
class task {
public:
string mname;
bool completed;
void start()
{
int a = 0;
for (int i=0 ; i<10000; i++)
{
for (int j=0 ; j<100000; j++)
{
a= i*2; …Run Code Online (Sandbox Code Playgroud) 我来这里是为了解决令我感到沮丧的情况.很多.首先,我在Windows上,我使用MinGW作为编译器(C++).
我在使用cpp-netlib和SSL(尝试POST到https站点)的程序中遇到了一些问题.我相信一切都井井有条,除了这一个不断躲避我的错误.
C:\boost_1_50_0\boost_1_50_0\stage\lib\libboost_thread-mgw46-mt-1_50.a(thread.o):thread.cpp|| undefined reference to 'boost::chrono::system_clock::now()'
我确信我已经链接到chrono,以及所有的.a libs BOOST_ROOT/stage/lib.我已经尝试重新排序,所以chrono在线程之前被链接.什么都没有帮助.我已经尝试BOOST_CHRONO_INLINED在我的IDE设置和多个conf.hpps中定义它仅使其成为标题,这没有帮助.
我很确定这是一个新手问题,我希望有人能给我一个快速解决方案.我匆匆写了这篇文章,因为我必须在某个地方,但如果你需要更多信息请说出来,我回家后可以更仔细地写.谢谢!
我需要一些关于此异常的帮助,我正在实现一个NPAPI插件,以便能够使用来自浏览器扩展的本地套接字,为此我正在使用Firebreath框架.
对于套接字和连接,我使用带有异步调用的Boost asio和一个包含5个工作线程的线程池.另外,每个线程都有一个截止日期来实现传输超时.
我使用插件扩展工作流程如下:
得到回应1
打开另一个插座2
写入套接字2
写套接字1
关闭套接字1(socket.cancel(),deadline.cancel(),socket.shutdown(),套接字释放).
得到回应2
由于所有内容都是跨语言,异步实际上很难调试,但是所有打开,写入或关闭都是从javascript调用的,并且从套接字1中读取,调用open 2,write 2,write 1并按顺序关闭1.
也许我告诉的事情是无关紧要的,因为抛出异常时调用堆栈没有显示我的任何函数,只显示它在malloc调用内部_heap_alloc_dbg_impl
因为它通常在第2或第3个完整周期中失败,似乎在步骤5和7之间发生.
但是,我认为它必须与asio相关,因为使用单个工作线程执行所有操作只会在第一个循环中与异常崩溃.
如果您需要,我愿意发布更多信息代码.
更新1:

更新2:
有10个线程启动:
workPtr.reset( new boost::asio::io_service::work(io_service));
for ( int i = 0; i < 10; ++i) {
m_threadGroup.create_thread( boost::bind(&boost::asio::io_service::run, &io_service) );
}
Run Code Online (Sandbox Code Playgroud)
第11届_threadstartex我不知道是谁推出的
在另一个线程(不是VS声称导致崩溃的那个)上有一个join_all()进行中因为我的类被销毁但我认为它不应该,所以也许这个崩溃是由于另一个异常和Firebreath进程关闭一切当它崩溃.
我想终止或杀死提升线程.代码在这里:
DWORD WINAPI StartFaceDetector(LPVOID temp)
{
int j=0;
char **argv1;
QApplication a(j,argv1);//add some thread here
gui::VisualControl w;
t=&w;
boost::thread u(&faceThread);
w.show();
a.exec();
// I Want to close u thread here.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想在返回函数之前关闭该boost线程.提前致谢.
我的任务是修改同步C程序,以便它可以并行运行.我们的目标是让它尽可能便携,因为它是许多人使用的开源程序.因此,我认为最好将程序包装在C++层中,这样我就可以利用便携式的boost库.我已经完成了这一切,一切似乎按预期工作.
我遇到的问题是决定在线程之间传递消息的最佳方法是什么.幸运的是,该程序的体系结构是多生产者和单个消费者的体系结构.更好的是,消息的顺序并不重要.我已经读过单一生产者/单一消费者(SPSC)队列将受益于这种架构.那些有多线程编程经验的人有什么建议吗?我对这些东西很新.此外,任何使用boost实现SPSC的代码示例都将非常感激.
boost-thread ×10
c++ ×10
boost ×4
boost-asio ×1
boost-python ×1
c++-chrono ×1
exception ×1
firebreath ×1
python ×1
qt ×1
threadgroup ×1
visual-c++ ×1