我注意到提升似乎不支持信号量.获得类似效果的最简单方法是什么?
我有一个方法,每30秒aprox发射一次.我需要一个线程.
我有一个方法,我可以从课外调用.像callThreadedMethod()这样的东西,它创建自己调用最终的threadedMethod的线程.
这些是MyClass的方法
void callThreadedMethod(){
mThread = boost::shared_ptr<boost::thread>(new boost::thread(&MyClass::threadedMethod, this));
}
void threadedMethod(){
//more code NOT inside a while loop
}
Run Code Online (Sandbox Code Playgroud)
那么每次调用方法时我都必须分离mThread吗?
在MyClass析构函数中调用join()是否足够?
threadMethod完成后,线程是否会自行销毁?
我没经验丰富boost::asio.我有一些非常基本的问题.
我需要有一个不同io_service,并且不同的socket根据不同thread,但一个单一的acceptor,要处理客户端的螺纹服务器?
我相信我必须为新客户提供不同的套接字.但是如果所有线程使用相同的线程io_service会是并行吗?
我在asio部分通过http://en.highscore.de/cpp/boost/index.html说我需要在不同的线程中使用不同的io_services来实现并行化.
我是否计划创建一个Server类,new TCPsession每次出现一个新客户端时创建一个,acceptor.async_accept
并且TCPSessionctor创建一个io_service和一个thread并io_service.run()在其自己的线程中运行它会是一个好的设计吗?
但是在这个设计中我会加入所有这些线程吗?我是否需要另一个io_service,main以便即使在获得新客户之前它也不会终止?
在Boost库1.50.0版的发行说明中,我注意到两个重大变化(见这里):
#6266断开变化:如果可连接,线程析构函数应该调用terminate.
#6269中断更改:线程移动分配应该在可连接时调用terminate.
这对我目前使用Boost 1.49.0的现有项目意味着什么?我需要改变什么吗?如果是的话,我该怎么做才能完全改变?如果我忘记修改我现有的一个项目会怎样?我是否会遇到编译时错误(我希望如此)或者我会遇到令人讨厌且难以发现的运行时问题(我绝对不希望如此)?
是否可以对boost :: asio中的条件变量执行异步等待(读取:非阻塞)?如果没有直接支持,任何有关实施它的提示将不胜感激.
我可以实现一个计时器,甚至每隔几毫秒启动一次唤醒,但这种方法非常低劣,我发现很难相信条件变量同步没有实现/记录.
我正在尝试学习如何使用C++ Boost.Thread库.我在我的Ubuntu 11.10系统上安装了Boost库.我正在阅读Schaling的"The Boost C++ Libraries"一书 - 特别是第66页的示例6.1.我正在尝试编译以下代码示例:
#include <boost/thread.hpp>
#include <iostream>
void wait(int seconds)
{
boost::this_thread::sleep(boost::posix_time::seconds(seconds));
}
void thread()
{
for(int i = 0; i < 5; ++i)
{
wait(1);
std::cout << i << std::endl;
}
}
int main()
{
boost::thread t(thread);
t.join();
}
Run Code Online (Sandbox Code Playgroud)
但是,当我从命令行使用以下代码编译它时:
$ g++ example61.cpp -o example61 -I /usr/local/include
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
/tmp/cc6bVu1F.o: In function `main':
example6.cpp:(.text+0x9d): undefined reference to `boost::thread::join()'
example6.cpp:(.text+0xae): undefined reference to `boost::thread::~thread()'
example6.cpp:(.text+0xc6): undefined reference to `boost::thread::~thread()'
/tmp/cc6bVu1F.o: In function `boost::detail::thread_data_base::thread_data_base()':
example6.cpp:(.text._ZN5boost6detail16thread_data_baseC2Ev[_ZN5boost6detail16thread_data_baseC5Ev]+0x24): undefined reference …Run Code Online (Sandbox Code Playgroud) 我什么时候宣布
boost::thread t1, t2;
Run Code Online (Sandbox Code Playgroud)
在我的程序中然后使用UPX压缩.exe文件,压缩成功.但是当我尝试启动压缩的exe时,Windows告诉我它是"无效的win32应用程序".
UPX有一个错误报告(类似的错误),但它有不同的错误消息("应用程序无法正确初始化(0xc0000005)").
在我的情况下,操作系统认为文件已损坏或其他东西,所以它甚至无法启动显示错误!为什么??
Win7x64,C++,VisualStudio,boost 1.47,UPX3.07
奇怪的消息:
解包exe会使损坏的exe抛出与此处完全相同的错误.("应用程序无法正确初始化(0xc0000005)")这是针对解压缩的exe,而不是在bug报告中打包.
extern "C" void tss_cleanup_implemented(void) {}
在包含boost的线程头之前并不重要.结果是一样的.
main.cpp中:
#include <boost/thread.hpp>
int main(int argc, char** argv)
{
boost::thread t;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
可能有人会尝试编译和压缩?
我有一个C++项目,一个C++\Cli项目和一个ac#win forms项目.
当我从win forms项目访问cli项目时,我可以访问和使用cli项目功能.但是当我将我的cpp项目头包含到cli项目中时,当我访问cli项目时,我从c#项目中得到这个运行时错误.
CliWrapper.Func meta = new CliWrapper.Func();
Run Code Online (Sandbox Code Playgroud)
这是我犯的错误:
BadImageFormatException:无法加载文件或程序集X或其依赖项之一.不是有效的Win32应用程序.(HRESULT异常:0x800700C1)
我意识到#include <boost/thread.hpp>导致问题
我对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) 我想终止或杀死提升线程.代码在这里:
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线程.提前致谢.
boost-thread ×10
c++ ×9
boost ×7
boost-asio ×2
c++-cli ×1
pthreads ×1
qt ×1
sockets ×1
threadgroup ×1
upx ×1