问题标签 [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.
c - 将 pthread 程序转换为 MPI?
我了解多线程程序和依赖机器间通信的程序之间的区别。我的问题是我有一个很好的用“C”编写的多线程程序,它在 8 核机器上运行良好。现在有机会将此程序移植到集群以访问更多内核。是否值得努力撕掉 pthread 的东西并改造 MPI(我从未使用过),或者我们最好从头开始重新编码整个东西(或大部分)?假设我们被 C “卡住”了,所以不能选择大规模改变语言。
c - 编译C程序时出错
我正在尝试完成一个涉及使用信号量的学校项目。我已经包含了正确的头文件(加上一个用于 pthreads)。我也将编译器指向了正确的库。这是用 C 编写的。是的,这是一个作业,但请注意,我不是在寻求实现方面的帮助,而是我似乎无法弄清楚这个该死的编译错误。
这是我的代码的第 47 到 50 行,它们是信号量的“简单”声明并初始化它们:
以下是我在尝试编译第 48 行时收到的消息。我在第 50 行得到了相同的设置,但为简洁起见没有发布:
我已经在 main() 函数之外声明了所有这些。如何解决这些错误?我很困惑,因为它似乎表明 sem_t 没有数据类型,但它是在我已包含的 semaphore.h 中定义的。我在使用 gcc 的 Ubuntu 下使用 Code::Blocks 编译它。即使从命令行编译也会出现此错误。
在此先感谢您的帮助。
c - pthread_cond_timedwait 立即返回
我有一个奇怪的问题。我有以下代码:
dbg
在每一行之前调用gettimeofday
并在该行前面加上时间。它导致以下输出:
如您所见,两条调试线之间只传递了 7 微秒,但pthread_cond_timedwait
返回了ETIMEDOUT
. 这怎么可能发生?我什至尝试在初始化 cond 变量时将时钟设置为其他值:
(没有打印出任何错误消息)。我都试过了CLOCK_REALTIME
和CLOCK_MONOTONIC
。
此代码是阻塞队列的一部分。我需要这样的功能,如果在 5 秒内没有任何东西放在这个队列上,就会发生其他事情。互斥体和条件都被初始化,因为如果我不使用阻塞队列工作正常pthread_cond_timedwait
。
multithreading - 在临界区取消 (p) 线程
我有一个运行多个线程的应用程序,这些线程有时会被取消。这些线程可能会调用另一个内部访问资源(套接字)的对象。为了防止同时访问资源,有一个关键部分可以在执行中获得一些顺序。
现在,当取消线程时,(有时)会发生线程正好在被临界区阻塞的代码中。临界区使用对象锁定,我希望在取消线程后,该对象将被破坏并因此释放锁定。然而,情况似乎并非如此,因此在线程销毁时,该资源对象被永久锁定。
更改资源对象可能不是一种选择(第 3 方交付),此外,防止同时访问无法并行使用的资源是有意义的。
我已经尝试过在该部分被锁定/解锁时使用 pthread_setcancelstate 来防止线程被取消,但是这确实感觉有点脏,并且不会成为其他情况的最终解决方案(例如获取互斥锁等)。
我知道首选的解决方案是不使用 pthread_cancel 而是在线程中设置一个标志,它会在准备好时自行取消(以干净的方式)。但是,由于我想尽快取消线程,我想知道(也是出于学术兴趣)是否还有其他选择。
c - Pthread 条件信号 - 未按预期工作
我正在做一个项目并尝试使用 pthread_cond_wait()
和 pthread_cond_signal()
同步两个线程。
我的代码看起来像这样:
预期的输出是:
我的输出根本不遵循这种模式。显然我在某处有逻辑错误,但我不明白在哪里。为什么recv_acks()
线程在遇到- 因为总是首先执行(因为我创建线程的顺序)并且总是在临界区之后执行,所以它在命中时并不总是屈服?pthread_cond_signal()
pthread_cond_wait()
cond_wait()
c++ - 如何从 C++ 获取 linux 2.6 中的 SPID
我有一个问题: linux 2.6 中的 SPID 是否可以从 C++ 应用程序中获取?当我执行“ps -amT”时,我可以看到进程中的线程:
然后在文件系统中我可以看到线程:
那么有什么方法可以从我的应用程序中获取 SPID,以便我可以以某种方式识别每个正在运行的线程中的 SPID 是什么?
谢谢!
/麦克风
编辑:我应该补充一点,从 getpid() 返回的 PID 在每个线程中都是相同的。
当我将此代码添加到我的线程时:
我得到这个结果:
两者都不像 ps 或 proc 文件系统中给出的 SPID。
另外,请注意gettid 不返回 SPID。
c++ - 当 C++ 线程退出时,内存是否保持分配状态?
我在 Linux 上使用 pthread 库。
我在线程 A 中分配了一个字符串,然后尝试在线程 B 中打印该字符串。但是,该字符串仅打印为空(我已验证它在线程 A 中有效)。
注意:字符串驻留在一个对象内,我怀疑它可能会被清理或重新实例化为空......容器对象不会给我一个段错误或任何东西,只是所有的值都是空的。
这是因为线程无法从其他线程访问内存,还是因为一旦线程 A 停止,内存就会被取消分配?或者两者都不是;这很可能是我的代码中的一个错误,但我只是想排除这种情况......
更新:
原来是内存问题。感谢您的回答,我自己也回答了这个问题,如果您同意/不同意,请对我的回答发表评论。
c++ - 使用 pthread 来利用多个内核的问题
我正在使用 SDL 和 Pthread 用 C++ 开发光线追踪器。我在使我的程序使用两个内核时遇到问题。线程可以工作,但它们不会 100% 使用两个内核。为了接口 SDL,我直接写入它的内存 SDL_Surface.pixels,所以我认为它不可能是 SDL 锁定我。
我的线程函数如下所示:
注意:scene->renderPixel 是 const,所以我假设两个线程都可以从同一个内存中读取。我有两个工作线程在做这件事,在我的主循环中我使用:
注意:我也尝试过创建和加入线程而不是同步它们。我用“-lpthread -D_POSIX_PTHREAD_SEMANTICS -pthread”编译它,gcc 没有抱怨。
我的问题最好使用执行期间的 CPU 使用图来说明:(
来源:jopsen.dk)
从图中可以看出,我的程序一次只使用一个内核,然后每隔一段时间在两者之间切换,但它永远不会将两者都驱动到 100%。我到底做错了什么?我没有在场景中使用任何互斥锁或信号量。我该怎么做才能找到错误?
此外,如果我将 while(true) 放在 scene->renderPixel() 周围,我可以将两个核心都推到 100%。所以我怀疑这是由开销引起的,但我只每 0.5 秒同步一次(例如 FPS:0.5),给定一个复杂的场景。我意识到告诉我我的错误可能并不容易,但是调试它的方法也很棒......我以前没有玩过pthreads......
另外,这可能是硬件或内核问题,我的内核是:
笔记:
c++ - 在结构中使用 pthread 条件等待
我之前询问过如何在不使用 pthread_join 的情况下同步两个线程,我能够使用 pthread_cond_wait 和 pthread_cond_signal 解决它。我编写了一个小结构来将此功能捆绑到一个地方:
假设我从两个不同的线程调用 Wait() 和 Signal(),这是否是线程安全的。在同一个对象的两个函数中使用相同的锁会导致死锁或竞争条件吗?
编辑:我现在在我的程序中使用它,它工作正常。我不太确定这是否只是运气
c++ - 在 C++ 中使用 pthread 时,何时需要实现锁定?
在发布我自己关于内存问题的解决方案后,nusi 建议我的解决方案缺少锁定。
以下伪代码以非常简单的方式模糊地代表了我的解决方案。
我完全不确定如何实现锁定,我什至不确定我为什么要这样做(注意实际的解决方案要复杂得多)。有人可以解释一下在这种情况下我应该如何以及为什么要实施锁定?