问题标签 [boost-thread]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
733 浏览

iphone - Boost.Thread 线程在发布版本中未在 iPhone/iPad 上启动

我们正在编写一个带有大量后台处理的 iPad 应用程序,所有这些都是用一组 C++ 库编写的。这些库在 Linux、Mac 和 Windows 上运行良好,但在 iPad 上它们只能在调试版本中运行。

在发布版本中,看起来当第一个子线程被启动时,它要么从未真正启动,要么在处理过程中没有足够远以允许主线程继续(从调试器是否由于在发布版本中使用断点的正常问题导致线程实际上正在启动)。

在调试器中查看主线程所在的位置boost::thread::start_thread(实际上在里面boost::detail::yieldboost::detail::spin_lock::lock

CPU 未达到 100%,因此自旋锁似乎不会导致新线程的创建处于饥饿状态。

我们已经尝试过 Boost 1.42 和 Boost 1.44,它们的行为方式相同。iOS 3.2 和 4.2 都失败了发布版本。

我们可能做错了什么,或者这是一个已知的不工作配置?

0 投票
6 回答
1599 浏览

c++ - 如何围绕阻塞调用实现定时等待?

所以,情况是这样的。我有一个 C++ 库,它正在做一些进程间通信,它有一个wait()阻塞和等待传入消息的函数。困难在于我需要一个定时等待,如果在指定的时间内没有收到任何消息,它将返回一个状态值。

最优雅的解决方案可能是重写库以向其 API 添加定时等待,但为了这个问题,我假设它不可行。(实际上,它看起来很困难,所以我想知道另一个选项是什么。)

以下是我如何在繁忙的等待循环中使用伪代码执行此操作:

不过,我不想要占用处理器周期的繁忙等待。而且我也不想只是sleep()在循环中添加一个调用来避免处理器负载,因为这意味着响应速度较慢。我想要一些通过适当的块和中断来做到这一点的东西。如果更好的解决方案涉及线程(这似乎很可能),我们已经在使用boost::thread,所以我更喜欢使用它。

我发布这个问题是因为这似乎是一种具有明确“最佳实践”正确答案的情况,因为这是一种非常常见的模式。正确的方法是什么?

编辑补充:我在这里的很大一部分担心是,这是程序中的一个点,它既对性能至关重要,又对避免竞争条件或内存泄漏至关重要。因此,虽然“使用两个线程和一个计时器”是有用的建议,但我仍然试图弄清楚如何以安全和正确的方式实际实现它,而且我很容易看到自己在我的代码中犯了新手错误甚至不知道我做了。因此,一些实际的示例代码将不胜感激!

另外,我担心多线程解决方案:如果我使用“将阻塞调用放在第二个线程中并在该线程上执行定时等待”方法,如果阻塞调用永远不会返回,那么第二个线程会发生什么? 我知道第一个线程中的定时等待会返回,我会看到没有任何答案发生并继续处理,但是我是否“泄漏”了一个将永远处于阻塞状态的线程?有没有办法避免这种情况?(有什么方法可以避免这种情况并避免泄漏第二个线程的内存?)如果阻塞调用没有返回,我需要一个完整的解决方案来避免泄漏。

0 投票
1 回答
1087 浏览

c++ - threading-related active object design questions (c++ boost)

I would like some feedback regarding the IService class listed below. From what I know, this type of class is related to the "active-object" pattern. Please excuse/correct if I use any related terminology incorrectly. Basically the idea is that the classes using this active object class need to provide a start and a stop method which control some event loop. This event loop could be implemented with a while loop or with boost asio etc.

This class is responsible for starting a new thread in a non-blocking manner so that events can be handled in/by the new thread. It must also handle all clean-up related code. I first tried an OO approach in which subclasses were responsible for overriding methods to control the event loop but the cleanup was messy: in the destructor calling the stop method resulted in a pure virtual function call in cases where the calling class had not manually called the stop method. The templated solution seems to be a lot cleaner:

The class could be used as follows:

Now to my specific questions:

1) Is the use of the boost condition variable correct? It seems like a bit of a hack to me: I wanted to wait for the thread to be launched so I waited on the condition variable. Then once the new thread has launched in the main method, I again wait on the same condition variable to allow the initial thread to continue. Then once the start method of the initial thread is exited, the new thread can continue. Is this ok?

2) Are there any cases in which the thread would not get launched successfully by the OS? I remember reading somewhere that this can occur. If this is possible, I should rather do a timed wait on the condition variable (as is commented out in the start method)?

3) I am aware that of the templated class could not implement the stop method "correctly" i.e. if the event loop fails to stop, the code will block on the joins (either in the stop or in the destructor) but I see no way around this. I guess it is up to the user of the class to make sure that the start and stop method are implemented correctly?

4) I would appreciate any other design mistakes, improvements, etc?

Thanks!

0 投票
1 回答
397 浏览

c++ - 在另一个线程中管理 io_service,异常的奇怪问题

在我的应用程序中,我一直在为这个问题苦苦挣扎,所以我试图在一个简单的代码片段中重现这个问题。

我正在使用 Boost 1.44 和 mingw32-g++ 版本 4.4.1。在 Windows XP 上

我对以下程序的预期结果是:

但实际上它有时会这样做,有时会详细地崩溃“未处理的 win32 异常......”(使用即时调试器),有时它会默默地崩溃

所以我不知道它为什么这样做。

如果我删除 try...catch 块,程序运行得很好。

这是代码:

在非主线程中管理 io_service 实例是否违法?还是我做了一些明显错误的事情!?

感谢任何帮助!

谢谢

0 投票
1 回答
1403 浏览

c++ - 中断或加入后重用 Boost 线程(来自线程池)

目前,我正在使用生产者消费者模型来渲染实时图形应用程序的部分。消费者将不断在我们的队列中寻找数据(无限循环);但是我担心这可能会导致我的模拟与主循环不同步。我认为这是快速生产者慢消费者问题 - 模拟被限制在一定时间内的事实使情况更加复杂。

问题-保持这一切平衡并确保消费者有足够的时间完成的最佳方法是什么,而且在我们完成渲染当前帧之前模拟不会移动到下一帧(或者至少能够检测到这一点并跳过渲染下一帧 - 或中断正在渲染的当前帧)我目前只是在每个消费者完成后中断和加入

第二个问题:如果您查看下面的代码,您会看到我目前只是在将渲染作业添加到队列后调用中断和加入 - 这允许线程始终完成其操作并响应中断等结束了。在调用 interrupt_all 和 join_all 之后,如何重用线程池中的线程?(即如果我再次调用drawNextFrame)

生产者是执行主线程的一部分(我认为这不会影响任何事情)

如果您需要查看消费者类,请参见下文:

我试着让这个简单快速地消化,谢谢你的时间

0 投票
3 回答
15161 浏览

c++ - 如何立即取消 curl 操作?

我在 C++ 中使用libcurl ,并且我使用Boost.Thread从我的 UI调用curl_easy_perform一个单独的线程。

主 UI 有一个取消按钮,我希望它能够完美响应(即,当用户单击它时,它应该立即做出反应)。我已经设置了读取、写入和进度回调来读取原子should_cancel变量(如在这个问题中),但是有两个问题:

  1. 从按下取消到卷曲操作完成时,通常会有一个非常小的(但很明显)的延迟。

  2. 有时,会有很长的(有时是无休止的)延迟。在这种情况下,要么:

    一种。很长时间没有调用进度、读取和写入回调,或者

    湾。调用进度回调,我返回一个非零值(意味着它应该终止),但是 curl 操作有一段时间没有完成(实际上,同时再次调用了进度函数!)

所以:

  1. 为什么会发生长时间的延迟(尤其是在没有调用进度函数的情况下)?
  2. 我应该怎么做才能让取消按钮正确反应?

一种可能性是告诉 UI 取消操作成功,但继续在后台运行 curl 线程,直到它取消。这个问题(我认为)是它强制should_cancel变量是全局的,而不是限定在操作开始的对话框中。

0 投票
2 回答
7605 浏览

c++ - 无限时间暂停 boost::thread

我正在使用 boost::thread 库 (V1.44) 来支持我的 C++ 项目中的线程。

用户需要能够无限期地暂停在其自己的线程中运行的测试循环的执行,并且能够随时恢复它。

在Windows下我这样解决了

这可以毫无问题地工作,即使知道无限中断的正确值会很好。

我开始实现我的程序的 linux 版本,但遇到了编译器错误的问题

错误:interruptible_wait不是成员boost::this_thread

问题:什么是暂停 boost::thread 无限时间的好方法(直到用户决定恢复它)

非常感谢你

0 投票
1 回答
631 浏览

c++ - 来自 C++ 增强线程的 NSOpenPanel

我正在从 boost C++ 创建的线程调用 NSOpenPanel。

面板行为不规律并且对鼠标的响应不佳,即单击对象有时在单击顶级组合框时不会提高响应。

我要运行一个单独的运行循环吗?我正在运行一个 runModalForDirectory,它应该负责运行它自己的循环。

我还创建了一个单独的 objc 类,该类执行 performSelectorOnMainThread 以在主线程中显示面板,但行为仍然相同。

我也尝试过使用 waitUntilDone:NO 并运行 CFRunLoopRunInMode 这也无济于事。

0 投票
2 回答
4310 浏览

c++ - C ++ 0x中的线程析构函数与boost

这些天我正在阅读 pdf设计 MT 程序。它解释说,用户必须在 C++0xdetach()中的类std::thread对象超出范围之前显式调用该对象。如果您不调用它将std::terminate()被调用并且应用程序将死亡。

我通常boost::thread用于 C++ 中的线程。如果我错了,请纠正我,但是当boost::thread对象超出范围时会自动分离。

在我看来,boost 方法遵循 RAII 原则,而 std 没有。

你知道这是否有什么特别的原因吗?

0 投票
1 回答
2371 浏览

linux - 在 linux 的 code::blocks 编译器中,如何添加编译标志,如“-lrt”或“-lboost_thread”?

在 gdb 中调试对我来说并不方便,所以我喜欢 code::blocks 提供的漂亮调试界面。现在我已经将我的项目移动到需要这些标志的区域(当然是标题中的那些),我发现我无法再编译 code::blocks 了:/。