问题标签 [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 投票
8 回答
2273 浏览

c++ - 在运行时选择互斥锁或虚拟互斥锁

我有一个在多个项目之间共享的类,它的一些用途是单线程的,有些是多线程的。单线程用户不希望互斥锁的开销,而多线程用户不希望自己进行锁定,希望能够选择性地以“单线程模式”运行。所以我希望能够在运行时在真实和“虚拟”互斥锁之间进行选择。

理想情况下,我将拥有一个shared_ptr<something>并分配一个真实或虚假的互斥对象。然后我会“锁定”它而不考虑里面有什么。

现在有一个signals2::dummy_mutex,但它不与 . 共享一个公共基类boost::mutex

那么,在不使锁定/保护代码比上面的示例更复杂的情况下,在真正的互斥锁和虚拟互斥锁(信号 2 中的一个或其他)之间进行选择的优雅方法是什么?

而且,在您指出替代方案之前:

  • 我可以在编译时选择一个实现,但是预处理器宏很难看,维护项目配置对我们来说很痛苦。
  • 多线程环境中的类用户不想承担锁定类使用的责任,而不是让类在内部进行自己的锁定。
  • “线程安全包装器”涉及的 API 和现有用法太多,无法成为实用的解决方案。
0 投票
1 回答
830 浏览

java - 如果使用 Jace JNI 进行多线程本机调用,Tomcat 会崩溃

我正在使用 Netbeans 构建一个加载 c++ 本机 dll 的 java web 项目(基于 tomcat 6.02)。我正在使用Jace包装 JNI 的库。

在我的 java 代码中,我有一个从 c++ 代码调用的静态回调函数。我正在尝试使用 boost.Thread 在新线程中调用此回调,但是当我这样做时,tomcat 会死掉而没有任何消息或崩溃报告。但是,如果我直接调用该函数,它就可以正常工作。

你能建议什么可能是错的吗?

下面是我的导致崩溃的 C++ 代码:

下面是我的 c++ 代码,可以正常工作:

Functor 类(导致崩溃):

以下是我的java代码:

编辑:

奇怪的是,下面的代码也有效。也就是说,如果我调用一次仿函数然后创建多个线程,则不会发生崩溃。此外,这种崩溃只发生在 Tomcat 中,而不是在我制作独立的 java 应用程序时。任何人都可以解释为什么会这样吗?

0 投票
1 回答
3250 浏览

c++ - 使用 Boost.Threads 的读写锁(如何转换这个简单的类)

我正在将一些代码从 Windows 移植到 Linux(Ubuntu 9.10)。我有一个简单的类(请参见下文),它使用 windows 函数来实现简单的互斥锁。我想使用 Boost.Threads 来重新实现它,但是那个库对我来说是新的。

有人可以指出我需要对下面的类进行更改,以便使用 Boost.Threads 而不是 WIN 特定功能吗?

0 投票
1 回答
2532 浏览

c++ - boost::thread_group - 可以在 join_all 之后调用 create_thread 吗?

我有以下情况:

我创建了一个 boost::thread_group 实例,然后创建线程以对某些数据进行并行处理,然后在线程上加入 join_all。

最初,我为每个 X 数据元素创建线程,如下所示:

但我有一个问题:当我有大量数据时,这段代码会生成大量线程(> 40 个线程),这会使处理器忙于线程切换上下文。

我的问题是:在调用 join_all之后是否可以在 thread_group 上调用 create_thread 。

也就是说,我可以将我的代码更改为此吗?

谁有这方面的经验,感谢您的任何见解。

0 投票
1 回答
657 浏览

c++ - 奇数 C++ 成员函数声明语法:&& 限定符

来自Boost::Thread

那些双&号到底是什么?我浏览了“BS The C++ Langauge 3d edition”,但找不到任何解释。

0 投票
2 回答
366 浏览

c++ - 我怎么知道哪个线程调用了一个方法

我有一个由多个线程调用的 threadSafe 方法。有没有办法知道哪个线程调用了它?

0 投票
1 回答
583 浏览

c - 闪烁和线程安全

我在 Windows (Win32, C/C++) 上使用 Scintilla 编辑控件。该控件是在 WndProc 中创建的。我有第二个线程,用 Boost.Thread 创建,它充当拼写检查器,并用红色波浪线标记拼写错误的单词。因此,我有两个线程更改 Scintilla 控件的内容。

起初,程序在编辑文本时崩溃。所以我研究了 Scintilla 的线程安全性。我发现的信息很少,但我设法在文档中得到了这个引用:

如果直接调用从不同线程执行到 Scintilla 窗口的本机线程会导致问题,在这种情况下,应使用 SendMessage(hSciWnd, SCI_*, wParam, lParam) 与窗口的线程同步。

当然,我使用的是直接调用,因此我将拼写检查线程中的所有调用更改为 SendMessage,现在程序不再崩溃。最后,这就是问题所在,我解决了这个问题,还是我会遇到 Scintilla 和多线程的其他怪癖?

0 投票
2 回答
5203 浏览

c++ - boost::asio::deadline_timer 是否为每个计时器使用一个线程?

我有一个需要在不同时间间隔更新的项目列表。该列表可以增长到数千个项目。每个项目可能具有不同的间隔。如果我为每个项目创建一个计时器,我会用线程使系统饱和吗?我在想最好创建一个等于一组项目中最小间隔的计时器,然后在每次更新时增加一个计数器,然后检查计数器现在是否等于任何其他间隔。如果最小间隔是所有其他间隔的倍数,这应该可以工作。有什么建议么?

0 投票
1 回答
3069 浏览

c++ - 多线程 MPI 进程突然终止

我正在编写一个 MPI 程序(Visual Studio 2k8 + MSMPI),它使用 Boost::thread 为每个 MPI 进程生成两个线程,并且遇到了我无法追踪的问题。

当我使用: 运行程序时mpiexec -n 2 program.exe,其中一个进程突然终止:

我不知道为什么第一个进程突然终止,并且无法弄清楚如何追查原因。即使我在所有操作结束时将零级进程放入无限循环中,也会发生这种情况......它只是突然死亡。我的主要功能如下所示:

Where the master and slave functions do some arbitrary work before ending. I can confirm that the master thread, at the very least, is reaching the end of it's operations. The slave thread is always the one that isn't done before the execution gets aborted. Using print statements, it seems like the slave thread isn't actually hitting any errors... it's happily moving along and just get's taken out in the crash.

So, does anyone have any ideas for:
a) What could be causing this?
b) How should I go about debugging it?

Thanks so much!

Edit:

Posting minimal versions of the Master/Slave functions. Note that the goal of this program is purely for demonstration purposes... so it isn't doing anything useful. Essentially, the master threads send a dummy payload to the slave thread of the other MPI process.

0 投票
4 回答
520 浏览

c++ - 来自非线程类的 C++ 线程类设计

我正在开发一个进行音频编码/解码的库。如果可用,编码器应能够使用多个内核(即多线程,使用 boost 库)。我现在拥有的是一个执行所有编码相关操作的类。

我要采取的下一步是使该类线程化。所以我想知道如何做到这一点。

我考虑过编写一个线程类,为 n 个内核创建 n 个线程,然后使用适当的参数调用编码器。但也许这有点矫枉过正,不需要另一个类,所以我将使用“用户界面”来创建线程。

我希望有任何建议。

编辑:我被迫使用多个线程进行预处理,使用 CUDA 创建输入数据的统计信息。因此,如果系统中有多个卡,并行使用它们的唯一方法是创建多个线程。

示例: 4 个文件,4 个不同的计算单元(单独的内存,唯一的设备 ID)。每个文件应在一个计算单元上执行。

我现在拥有的是:

所以我认为最好的方法是从 main() 线程调用 worker

而不是实现线程类。