问题标签 [pthreads]

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 回答
34774 浏览

c - 使用 pthread_create() 时将结构作为参数传递

我尝试将结构作为第四个参数传递,同时使用pthread_create()如下内容:

现在,每当我尝试访问结构中的变量 - ta、tb 或 tc 时,我都会不断收到错误消息 - 请求非结构或联合中的成员。

我可以使用什么替代方法将结构传递到线程中?

0 投票
5 回答
7553 浏览

c++ - 使用 -pthreads 为 Openwrt Linux 编译 C++ - 获取分段错误

我对 C++ 编程很陌生,我正在使用 pthreads。我正在为 OpenWRT 交叉编译我的代码,但由于某种原因,当我在我的板上运行程序时出现分段错误,但它在我的 PC 上运行良好。我怀疑错误发生在编译的链接阶段,因为我尝试了一个小的 C 程序并且效果很好。此外,如果我将文件名更改为 .cpp 并使用 g++ 编译它也可以工作。

eclipse编译器的输出:

编辑:删除旧代码并放入一个新的更简单的示例。如果我将其编译为 C 程序,则此代码会运行,但如果我将其编译为 C++ 程序则不会。我在板上运行 2.6.26.3 内核。

0 投票
2 回答
1782 浏览

c++ - pthread-win32 的 VS rand() 问题

我在 pthread 编程中遇到了一个奇怪的问题我在 vs2005 中使用pthread-w32编译了以下代码

输出是这样的

就像 rand() 在每两次调用中返回相同的结果并且我有 srand() 但每次运行程序时结果都不会改变

我对多线程编程很陌生,我听说 rand() 不是线程安全的。但我仍然无法弄清楚上面的程序是错误的还是 rand() 函数有问题。

0 投票
2 回答
4205 浏览

c - 什么时候破坏 pthread 屏障是安全的?

如果我有一个初始化的 pthread_barrier_t,什么时候可以安全地销毁它?下面的例子安全吗?

0 投票
3 回答
27655 浏览

linux - 我需要 -D_REENTRANT 和 -pthreads 吗?

在 Linux(内核 2.6.5)上,我们的构建系统使用-D_REENTRANT.

使用时还需要这个pthreads吗?

它与gcc -pthread期权有什么关系?我知道我应该-pthread与 pthreads 一起使用,我还需要-D_REENTRANT吗?

附带说明一下,您知道在 gcc 3.3.3 和 gcc 4.xx 之间使用 REENTRANT 之间有什么区别吗?

当我使用-pthreadgcc 选项时,我可以看到它_REENTRANT被定义了。-D_REENTRANT从命令行省略是否会产生任何影响,例如,是否可以在没有多线程支持的情况下编译某些对象,然后链接到使用 pthread 的二进制文件中并会导致问题?

我认为应该可以使用: g++ -pthread

我们正在编译多个静态库和与静态库链接的应用程序,库和应用程序都使用 pthread。

我相信它在过去的某个阶段是必需的,但想知道它是否仍然是必需的。谷歌搜索没有返回任何最近提到的信息 - D_REENTRANTwith pthreads. 您能否指出我在最近版本的kernel/gcc/pthread中讨论使用的链接或参考资料?

澄清:目前我们正在使用 -D_REENTRANT 和 -lpthread,我假设我可以用 g++ -pthread 替换它们,查看 man gcc 它为预处理器和链接器设置了标志。有什么想法吗?

0 投票
8 回答
7946 浏览

c++ - C++ - 线程和多个队列

我需要建立一个工人系统(表示为线程)和(多个)队列。单个作业在其中一个队列中等待,并等待工作线程处理它们。每个工作人员只能处理一些队列中的作业。没有旋转等待。C/C++、pthreads、标准 POSIX。

对我来说,问题是“多个队列”的事​​情。我知道如何用一个队列来实现它。工作人员需要等待他们可以处理的所有队列(等待其中的任何一个)。

在 Windows 上,我会使用 WaitForMultipleObjects,但这需要是多平台的。

我不想要任何特定的代码,只想要我应该使用的模型的提示或描述。提前致谢。

0 投票
1 回答
8382 浏览

linux - pthreads的好级别?

在嵌入式系统(使用 glibc 2.6.1 的 ARM 处理器上的 Linux 内核 2.6.28)上,我正在运行一个由多个线程组成的应用程序。我希望其中一个线程比其他线程获得更多的 CPU 时间。

设置优先级的一种选择似乎是将pthread\_setschedparamSCHED\ _RR(或SCHED\ _FIFO)一起使用,但是这会给线程带来太多的 CPU(除非它休眠,否则它会从仍在使用的其他线程中吃掉所有 CPU SCHED_OTHER)。

另一种选择是设置线程的好级别。然而,虽然这正是我正在寻找的(线程只是获得更多的 CPU,但不能饿死其他线程),但我无法让它正常工作。根据手册页“线程不共享一个共同的好值”,我将其解释为我可以为同一进程中的不同线程设置单独的好值。

这是我的代码:

但是,所有线程中的 tid 似乎都是相同的。此外,在调用getpriority. 从性能来看,这是一致的(即用相同的任务运行线程 A 和线程 B,然后将 A 设置为 -19,将 B 设置为 19,两者将在大致相同的时间完成)。

然而,当运行线程 A 时,将其设置为 -19,然后运行 ​​B 并将其设置为 +19 将使 B 以全功率运行(完成方式领先于 A)。

所以看起来一个线程会在运行时使用漂亮的级别集,之后无法更改它。

我疯狂地在谷歌上搜索更多信息或任何形式的确认,但到目前为止我发现的都是相当模糊的。这里有人对Linux(2.6.28,glibc 2.6.1)上处理线程的良好级别有任何描述吗?我怎么可能改变已经运行的线程的好级别?

0 投票
3 回答
7249 浏览

c - 主/工作线程和信号处理

我正在编写一个程序,有一个主线程和一些工作线程,我想正确处理信号。我的问题如下:

主线程启动并进行所有分配

主线程设置一个 SIGINT 信号处理程序

主线程启动工作线程。工作线程不需要特殊的清理,但是它们可以在系统调用或信号量上休眠。

当收到 SIGINT 时,我的理解是只有一个线程收到它。因此,如果线程在系统调用或信号量上处于休眠状态,它们将不会被唤醒,并且我将无法 pthread_join 我的工作线程并在我的主线程中进行所有必要的清理。

以下信号处理程序可以解决我的问题吗?

我期望的是,在收到 SIGINT 后,所有线程都会收到另一个信号,退出阻塞调用,看到g_do_cleanup标志并优雅地退出。

欢迎任何关于如何正确执行此操作的评论或链接。

编辑:我不是在寻找一种方法来唤醒等待特定条件的多个线程,所以我不认为 pthread_cond_signal 方法是我正在寻找的。我想要的是:

  • 找到一种方法,使在阻塞调用中被阻塞的所有线程都从这些调用中返回。
  • 或者杀死除主线程之外的所有线程。
0 投票
4 回答
6495 浏览

c++ - 等待多个事件 C++

是否有推荐的方法来等待多个输入。例如,我希望我的程序能够接收来自 3 个来源的输入:

监听线程条件,例如 pthread_cond_wait()

从标准输入中获取数据,例如 getline()

监听套接字,例如 accept()

实现这一目标的最佳方法是什么?每个不同的输入源都需要一个线程吗?谢谢

0 投票
1 回答
5406 浏览

events - 基于 pthread 的事件只唤醒等待线程

在我的 C++ 程序中,我有一个类 CEvent,它带有基于 pthreads 的触发器和等待成员函数(在 Linux 上运行)。如果有一个等待进程,实现是非常明显的(即网上有很多例子)。但是现在我需要满足多个线程正在等待事件的要求,并且在调用 trigger() 时应该全部可靠地唤醒。作为第二个条件,只有在调用 trigger() 时正在等待的线程才应该被唤醒。

我当前的代码:

这似乎几乎可以工作,因为在我将 wakeUp 设置回 false 之前等待的所有线程都会唤醒。但是在广播和wakeUp 的重置之间,调用wait() 的其他(或相同)线程也将立即唤醒,这是不可接受的。在 mutext 解锁之前放置 wakeUp = false 可以防止线程唤醒。

我的问题: * pthread_cond_broadcast 何时返回?即有没有保证它只会在所有线程都被唤醒后才返回,或者它可以在之前返回吗?* 这个问题有什么推荐的解决方案吗?