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

c - 将 pthread 程序转换为 MPI?

我了解多线程程序和依赖机器间通信的程序之间的区别。我的问题是我有一个很好的用“C”编写的多线程程序,它在 8 核机器上运行良好。现在有机会将此程序移植到集群以访问更多内核。是否值得努力撕掉 pthread 的东西并改造 MPI(我从未使用过),或者我们最好从头开始重新编码整个东西(或大部分)?假设我们被 C “卡住”了,所以不能选择大规模改变语言。

0 投票
1 回答
24929 浏览

c - 编译C程序时出错

我正在尝试完成一个涉及使用信号量的学校项目。我已经包含了正确的头文件(加上一个用于 pthreads)。我也将编译器指向了正确的库。这是用 C 编写的。是的,这是一个作业,但请注意,我不是在寻求实现方面的帮助,而是我似乎无法弄清楚这个该死的编译错误。

这是我的代码的第 47 到 50 行,它们是信号量的“简单”声明并初始化它们:

以下是我在尝试编译第 48 行时收到的消息。我在第 50 行得到了相同的设置,但为简洁起见没有发布:

我已经在 main() 函数之外声明了所有这些。如何解决这些错误?我很困惑,因为它似乎表明 sem_t 没有数据类型,但它是在我已包含的 semaphore.h 中定义的。我在使用 gcc 的 Ubuntu 下使用 Code::Blocks 编译它。即使从命令行编译也会出现此错误。

在此先感谢您的帮助。

0 投票
4 回答
15596 浏览

c - pthread_cond_timedwait 立即返回

我有一个奇怪的问题。我有以下代码:

dbg在每一行之前调用gettimeofday并在该行前面加上时间。它导致以下输出:

如您所见,两条调试线之间只传递了 7 微秒,但pthread_cond_timedwait返回了ETIMEDOUT. 这怎么可能发生?我什至尝试在初始化 cond 变量时将时钟设置为其他值:

(没有打印出任何错误消息)。我都试过了CLOCK_REALTIMECLOCK_MONOTONIC

此代码是阻塞队列的一部分。我需要这样的功能,如果在 5 秒内没有任何东西放在这个队列上,就会发生其他事情。互斥体和条件都被初始化,因为如果我不使用阻塞队列工作正常pthread_cond_timedwait

0 投票
4 回答
827 浏览

multithreading - 在临界区取消 (p) 线程

我有一个运行多个线程的应用程序,这些线程有时会被取消。这些线程可能会调用另一个内部访问资源(套接字)的对象。为了防止同时访问资源,有一个关键部分可以在执行中获得一些顺序。

现在,当取消线程时,(有时)会发生线程正好在被临界区阻塞的代码中。临界区使用对象锁定,我希望在取消线程后,该对象将被破坏并因此释放锁定。然而,情况似乎并非如此,因此在线程销毁时,该资源对象被永久锁定。

更改资源对象可能不是一种选择(第 3 方交付),此外,防止同时访问无法并行使用的资源是有意义的。

我已经尝试过在该部分被锁定/解锁时使用 pthread_setcancelstate 来防止线程被取消,但是这确实感觉有点脏,并且不会成为其他情况的最终解决方案(例如获取互斥锁等)。

我知道首选的解决方案是不使用 pthread_cancel 而是在线程中设置一个标志,它会在准备好时自行取消(以干净的方式)。但是,由于我想尽快取消线程,我想知道(也是出于学术兴趣)是否还有其他选择。

0 投票
4 回答
7178 浏览

c - Pthread 条件信号 - 未按预期工作

我正在做一个项目并尝试使用 pthread_cond_wait()pthread_cond_signal()同步两个线程。

我的代码看起来像这样:

预期的输出是:

我的输出根本不遵循这种模式。显然我在某处有逻辑错误,但我不明白在哪里。为什么recv_acks()线程在遇到- 因为总是首先执行(因为我创建线程的顺序)并且总是在临界区之后执行,所以它在命中时并不总是屈服?pthread_cond_signal()pthread_cond_wait()cond_wait()

0 投票
1 回答
3287 浏览

c++ - 如何从 C++ 获取 linux 2.6 中的 SPID

我有一个问题: linux 2.6 中的 SPID 是否可以从 C++ 应用程序中获取?当我执行“ps -amT”时,我可以看到进程中的线程:

然后在文件系统中我可以看到线程:

那么有什么方法可以从我的应用程序中获取 SPID,以便我可以以某种方式识别每个正在运行的线程中的 SPID 是什么?

谢谢!

/麦克风

编辑:我应该补充一点,从 getpid() 返回的 PID 在每个线程中都是相同的。

当我将此代码添加到我的线程时:

我得到这个结果:

两者都不像 ps 或 proc 文件系统中给出的 SPID。

另外,请注意gettid 不返回 SPID

0 投票
8 回答
5756 浏览

c++ - 当 C++ 线程退出时,内存是否保持分配状态?

我在 Linux 上使用 pthread 库。

我在线程 A 中分配了一个字符串,然后尝试在线程 B 中打印该字符串。但是,该字符串仅打印为空(我已验证它在线程 A 中有效)。

注意:字符串驻留在一个对象内,我怀疑它可能会被清理或重新实例化为空......容器对象不会给我一个段错误或任何东西,只是所有的值都是空的。

这是因为线程无法从其他线程访问内存,还是因为一旦线程 A 停止,内存就会被取消分配?或者两者都不是;这很可能是我的代码中的一个错误,但我只是想排除这种情况......

更新:

原来是内存问题。感谢您的回答,我自己也回答了这个问题,如果您同意/不同意,请对我的回答发表评论。

0 投票
3 回答
4167 浏览

c++ - 使用 pthread 来利用多个内核的问题

我正在使用 SDL 和 Pthread 用 C++ 开发光线追踪器。我在使我的程序使用两个内核时遇到问题。线程可以工作,但它们不会 100% 使用两个内核。为了接口 SDL,我直接写入它的内存 SDL_Surface.pixels,所以我认为它不可能是 SDL 锁定我。

我的线程函数如下所示:

注意:scene->renderPixel 是 const,所以我假设两个线程都可以从同一个内存中读取。我有两个工作线程在做这件事,在我的主循环中我使用:

注意:我也尝试过创建和加入线程而不是同步它们。我用“-lpthread -D_POSIX_PTHREAD_SEMANTICS -pthread”编译它,gcc 没有抱怨。

我的问题最好使用执行期间的 CPU 使用图来说明:( 来源:jopsen.dk执行期间的 CPU 使用率。

从图中可以看出,我的程序一次只使用一个内核,然后每隔一段时间在两者之间切换,但它永远不会将两者都驱动到 100%。我到底做错了什么?我没有在场景中使用任何互斥锁或信号量。我该怎么做才能找到错误?

此外,如果我将 while(true) 放在 scene->renderPixel() 周围,我可以将两个核心都推到 100%。所以我怀疑这是由开销引起的,但我只每 0.5 秒同步一次(例如 FPS:0.5),给定一个复杂的场景。我意识到告诉我我的错误可能并不容易,但是调试它的方法也很棒......我以前没有玩过pthreads......

另外,这可能是硬件或内核问题,我的内核是:

笔记:

0 投票
1 回答
694 浏览

c++ - 在结构中使用 pthread 条件等待

我之前询问过如何在不使用 pthread_join 的情况下同步两个线程,我能够使用 pthread_cond_wait 和 pthread_cond_signal 解决它。我编写了一个小结构来将此功能捆绑到一个地方:

假设我从两个不同的线程调用 Wait() 和 Signal(),这是否是线程安全的。在同一个对象的两个函数中使用相同的锁会导致死锁或竞争条件吗?

编辑:我现在在我的程序中使用它,它工作正常。我不太确定这是否只是运气

0 投票
6 回答
345 浏览

c++ - 在 C++ 中使用 pthread 时,何时需要实现锁定?

在发布自己关于内存问题的解决方案后,nusi 建议我的解决方案缺少锁定

以下伪代码以非常简单的方式模糊地代表了我的解决方案。

我完全不确定如何实现锁定,我什至不确定我为什么要这样做(注意实际的解决方案要复杂得多)。有人可以解释一下在这种情况下我应该如何以及为什么要实施锁定?