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

c - 如何终止正在等待信号量操作的线程

我正在编写一个将共享内存和信号量用于 ipc 的程序。有一个主服务器进程创建共享内存和信号量。任何数量的客户端进程都可以附加到共享内存并在允许时对其进行读写。信号量提供阻塞机制来控制读取和写入。一切正常,除非我尝试终止客户端。访问共享内存的信号量块位于线程中,并且在进程终止时,我无法释放信号量块,因此线程正确退出。我该怎么办?这是针对 Linux 的。

具体来说,有一个 shm 和两个 sem。第一个 sem 阻止写入,第二个阻止读取。当客户端有东西要写时,它会等待 write sem 为 0,然后将其设置为 1,写入,然后将 read sem 设置为 0,这会释放等待的服务器以读取客户端写入的内容。一旦读取,服务器将 write sem 设置回 0,并且下一个客户端开始写入。它挂在读取 sem 为 0 时释放的 semop 调用上。这个 semop 调用在一个线程中,我需要弄清楚如何在让主线程终止之前正确退出该线程。

这是我想做但不起作用的示例(睡眠假装是挂起的 semop 调用):

0 投票
9 回答
111735 浏览

c++ - 类中的 pthread 函数

假设我有一个课程,例如

然后我有一个 c 向量

现在,我想创建一个线程c.print();

以下是给我以下问题:pthread_create(&t1, NULL, &c[0].print, NULL);

错误输出:无法将参数 '3' 的 'void* (tree_item:: )(void )' 转换为 'void* ( )(void )' 到 'int pthread_create(pthread_t*, const pthread_attr_t*, void* ( )(void ), 无效*)'</p>

0 投票
2 回答
1429 浏览

pthreads - 是否有等效于 WatiForMultipleObjects 的 pthread

我有以下 Windows 代码生成两个线程,然后等待它们都完成:

我现在正在移植相同的代码以使用 pthreads,但不确定如何执行以下操作WaitForMultipleObjects

是否有使用 pthreads 的等效方法来实现相同的功能?

0 投票
3 回答
1326 浏览

c - 什么是线程池?

实现线程池的概念是什么(在 pthreads 的帮助下用 C 语言)?如何分配线程从线程池中执行?

0 投票
4 回答
6498 浏览

iphone - iPhone:多任务、多线程?

有人告诉我 iPhone 不支持多任务和多线程。这对我来说没有意义,所以我在模拟器上进行了测试:pthreads 有效,fork() 无效。这个结果对我来说确实有意义,但现在我不确定:pthread 库是否也可以在真实设备上运行?

谢谢。

0 投票
3 回答
704 浏览

c++ - 如果从 C 源而不是 C++ 源调用 pthread_exit,则取消处理程序将不会运行

我正在将 C++ 源代码与 C 源代码和 C++ 源代码链接起来。我用 pthread 创建一个线程,一个取消点,然后我通过 C 或 C++ 源文件调用 pthread_exit。

如果 pthread_exit 调用来自 C 源代码,则取消处理程序不会触发!这可能是什么原因?

抄送:

vpp.cc:

vc:

与s:

编译

如果 PTHREAD_EXIT 是 Vpp,程序会显示一条消息并终止,如果是 V 或 Vs,则不会。

V 和 Vpp 的反汇编是相同的,在 V 和 Vpp 之间改变 PTHREAD_EXIT 的定义只是在反汇编之间call Vcall Vpp反汇编中改变。

编辑:在另一台计算机上无法重现,所以我想我在库中遇到了错误或其他什么。

0 投票
4 回答
28007 浏览

c - C中的多写线程安全队列

我正在使用 pthreads 开发多线程 C 应用程序。我有一个写入数据库的线程(数据库库只能在单个线程中安全使用),还有几个线程正在收集数据,处理它,然后需要将结果发送到数据库线程进行存储。我在提到过在 C 中创建一个多写入器安全队列是“可能的”,但是我看到的每个地方都只是说它“对于这个例子来说太复杂了”并且仅仅演示了一个单写入器安全队列.

我需要以下东西:

  • 高效的插入和移除。我假设像任何其他队列一样,O(1) 入队和出队是可能的。
  • 动态分配的内存,即链接结构。我不需要对队列的大小有任意限制,所以数组真的不是我想要的。

编辑:读取线程不应该在空队列上旋转,因为可能有几分钟没有写入的时间,大量写入的短脉冲。

0 投票
2 回答
547 浏览

multithreading - 了解 POSIX 线程

我对 POSIX 线程有些困惑,我想知道我对 Pthreads 的理解是否正确,

根据我的说法,它位于本机层之上,有助于处理多线程。它提供了一种通用语法,有助于从一个操作系统移植到另一个操作系统。它在内部处理各种特定于操作系统的构造。

如果我错了,请告诉我并添加我错过的点。

0 投票
3 回答
1859 浏览

c - 使用 pthread_cond_wait 和 pthread_cond_signal 保证让步

假设我有一个具有 3 个 POSIX 线程的 C 程序,共享一个全局变量、互斥体和条件变量,其中两个正在执行以下伪代码:

第三次运行:

假设第三个线程将看到前两个线程的数据是否安全?

换一种说法,如果一个线程正在等待一个互斥锁和一个条件变量,是否可以安全地假设如果发出信号,它将是下一个获得锁的线程,而不是可能正在等待的其他线程锁?

0 投票
2 回答
7506 浏览

linux - 在 Linux 中仅更改一个线程的 UID/GID

有没有办法在多线程进程中仅更改一个线程的 UID/GID?

这样做的原因是编写一个文件服务应用程序 - 除非调用者的 uid/gid 设置为正确的用户,否则不会强制执行 ACL 和配额,没有使用正确的 uid/gid 创建新文件/目录等。

网络应用程序通常可以在开始时自己 fork() 并在单独的进程中处理每个用户请求。如果需要共享数据,它必须经过某种共享内存。但是,例如 FUSE(linux 用户文件系统)默认使用多线程,并且与 python 绑定结合使用分叉模型是不切实际的。

整个进程的“一致”UID 似乎符合 POSIX 标准,但是旧的 Linux 不遵循 POSIX 并允许不同线程使用不同的 uid。新内核似乎遵循 POSIX,有什么方法可以允许旧的“损坏”行为吗?