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

windows - pthread 和 CreateThread 的死锁

我在 Windows 应用程序中使用 pthreads。我注意到我的程序陷入僵局——快速检查表明发生了以下情况:

线程 1 产生线程 2。线程 2 产生线程 3。线程 2 等待来自线程 3 的互斥锁,该互斥锁未解锁。

所以,我去gdb调试,回溯第三个线程时得到以下信息:

它在 Windows CreateThread 函数中以某种方式卡住、死锁!显然,当它甚至无法开始执行代码时,它也无法解锁互斥锁。然而,尽管它显然被困在这里,但 pthread_create 返回零(成功)。

让这特别奇怪的是,Linux 上的同一个应用程序没有这样的问题。到底什么会导致线程在创建过程中挂起(!?)但成功返回,就好像它已正确创建一样?

编辑:响应代码请求,这里有一些代码(简化):

线程的创建:

请注意,它一直等到 b_thread_active 被设置,所以不知何故 b_thread_active 被设置了,所以被调用的线程必须做了一些事情......

...这是lookahead_thread函数:

lookahead_slicetype_decide (h); 是线程所做的事情。

互斥体,synch_frame_list_get_size:

线程2的回溯:

0 投票
2 回答
2536 浏览

c - C : pthread 数据特定的析构函数只调用一次

pthread_key_create手册页:

可选的析构函数可以与每个键值相关联。在线程退出时,如果键值具有非 NULL 析构函数指针,并且线程具有与键关联的非 NULL 值,则以当前关联值作为其唯一参数调用指向的函数。如果线程退出时存在多个析构函数,则未指定析构函数调用的顺序。

如果在所有非 NULL 值与关联的析构函数调用了所有析构函数之后,仍然有一些非 NULL 值与关联的析构函数,则重复该过程。如果在析构函数的至少 [PTHREAD_DESTRUCTOR_ITERATIONS] 次迭代调用杰出的非 NULL 值之后,仍然有一些非 NULL 值具有关联的析构函数,则实现停止调用析构函数。

我写了一个小例子,用一个简单的析构函数为非 NULL 线程特定值打印“Hello World”。据我所知,这个析构函数只被调用一次(至少在 linux fedora 和 mac os x 上),即使在第一次调用析构函数后线程特定的值仍然不是 NULL。

我错过了什么吗?!(在 glibc 上 PTHREAD_DESTRUCTOR_ITERATIONS = 4。)

这是我的小例子:

0 投票
1 回答
1831 浏览

c - pthread退出时如何防止进程退出?

我正在用 C 编写一个服务器程序,其中每次客户端连接时,我都会创建一个新的 pthread 来处理客户端的请求。

但是,当所有线程都退出时,我的程序就会退出,就好像调用了 exit() 一样。这是一个问题——我该如何克服它?

假设服务器正在运行,并且有 2 个客户端连接。一旦这些客户端断开连接——因此两个线程都退出了——那么我的服务器进程就会退出。我想要的是让我的服务器保持接受()套接字请求。通常这在我使用 fork() 和 accept() 时有效。我做错了什么导致父进程终止而不是无限循环?

代码看起来基本上是这样的:

另外:这是我已经问过的问题的同一个项目(链接如下)......虽然在花费太多时间尝试使用 select() 和 IPC 失败后,我想我会给线程一个旋转,因为它的简单性共享地址空间。

在 C 中使用管道进行父子 IPC 会导致程序阻塞

此外,大部分代码取自这里:http ://www.s5h.net/2006/06/27/pthread-socket-server-in-c/

0 投票
2 回答
1167 浏览

linux - Linux线程资源泄漏?

在多线程 Linux 应用程序之一中,应用程序退出而不删除线程。这会导致任何线程资源泄漏。如果在一天中多次启动此应用程序,系统会崩溃吗?

0 投票
1 回答
9826 浏览

c - 使用函数指针从线程调用回调

c程序编译器gcc

我有 3 个文件。main.c stop_watch.h 和 stop_watch.c

这个程序确实有效。我打电话给 start_stopwatch。并且它会在时间到期后在 main.c timeout_cb() 中回调。我也在一个单独的线程中运行它,因为我不想在 main 中阻塞,因为我将有其他需要运行的代码。

1) g_start_timer 中的秒数总是垃圾。我想我可能已经通过在堆上创建结构来解决这个问题。无论如何我可以解决这个问题。我正在考虑在堆上创建秒元素。但认为这已经结束了

2)这个程序工作正常,但如果我注释掉 main printf("=== timeout_cb: %p\n", timeout_cb); 中的行 它将堆栈转储。

3) 什么时候是释放内存的最佳时间。我主要释放它。但我担心如果在线程完成之前释放内存。这可能会导致非常意想不到的结果。我想我可以在调用后使用 thread_join() 来释放内存。但是,我需要返回在 stop_watch.c 中创建的 thead_id,有没有办法返回在 stop_watch.c 中创建的 thread_id

非常感谢您的任何建议,

主程序

stop_watch.h

stop_watch.c

0 投票
2 回答
4845 浏览

c - 如何使用 pthread 读取/写入共享变量?

我有两个线程,在 linux 上使用 C pthreads。其中一个写入数据,另一个正在读取数据。我正在使用一个变量来允许读取线程何时允许读取并允许写入线程。所以互斥锁适用于这个名为“newData”的布尔变量。我的问题是:我是否需要在“if”条件内锁定/解锁访问周围的互斥锁?两种方式都有效,但我认为只是因为在这个变量上重叠写/读的机会很少。我展示了两种选择来更好地解释我的问题:

线程 1:

线程 2:

第二个版本,有效,但我不知道它是否正确:

线程 1:

线程 2:

0 投票
2 回答
2617 浏览

c - pthread 回调中断用户输入

我已经编写了自己的 stop_watch 模块。这将创建一个线程并休眠几秒钟。一旦秒数过期,它将调用 main.c 中的回调函数并通知用户时间已过期。

这样用户将只有 3 秒的时间输入一个数字,而他们必须输入 5 个数字。如果时间到期,程序必须停止。

2个问题。1)如果他们在要求的时间内输入数字。我怎样才能取消线程。我正在考虑使用 thread_kill 或 thread_cancel?2)如何终止 do_while 循环?因为 scanf 在等待用户进入时会阻塞。

非常感谢您的任何建议,

我的代码如下:

顺便说一句,这个问题是关于 C99 gcc 的。

0 投票
7 回答
5467 浏览

multithreading - 使用更多线程时,什么会使程序运行速度变慢?

这个问题是关于我之前问过的同一个程序。回顾一下,我有一个具有如下循环结构的程序:

bin_index是其论点的完全确定性函数,就这个问题而言,它不使用或更改任何共享状态 - 换句话说,它显然是可重入的。

我第一次编写这个程序是为了使用单线程。然后我将它转换为使用多个线程,这样线程n运行外部循环 where 的所有迭代i1 % nthreads == n。所以在每个线程中运行的函数看起来像

并且所有的thread_local_histograms 都在最后添加到主线程中。

奇怪的是:当我只用 1 个线程运行程序以进行某些特定大小的计算时,大约需要 6 秒。当我用 2 或 3 个线程运行它时,进行完全相同的计算,大约需要 9 秒。这是为什么?我希望使用 2 个线程会比 1 个线程快,因为我有一个双核 CPU。该程序不使用任何互斥锁或其他同步原语,因此两个线程应该能够并行运行。

time供参考:一个线程(这是在 Linux 上)的典型输出:

和两个线程:

代码位于http://static.ellipsix.net/ext-tmp/distintegral.ccs

PS我知道有专门为这种事情设计的库可能会有更好的性能,但这就是我的最后一个问题,所以我不需要再次听到这些建议。(另外我想使用 pthreads 作为学习经验。)

0 投票
2 回答
5545 浏览

c - 为什么只有 2 个线程处于活动状态时 pthread_create() 会失败?

我在第一次尝试 C 中的线程时遇到了一些麻烦。我正在尝试(现在)编写一个非常简单的服务器程序,该程序接受套接字连接并启动一个新线程来处理它。它似乎工作正常,只是它只会在 pthread_create() 使用 EAGAIN 代码失败之前创建大约 300 个线程(303,有时是 304),这意味着:

“系统缺乏创建另一个线程所需的资源,否则将超过系统对进程 {PTHREAD_THREADS_MAX} 中的线程总数施加的限制。”

不是同时303 个线程 - 每个线程都退出,这是由 gdb 确认的。每次调用进程请求函数时,都会有两个线程在运行。

所以这意味着“系统缺乏必要的资源”。我的问题是(可能有点愚蠢)——这些资源是什么?大概这是我的程序中的内存泄漏(当然可能,甚至可能),但我认为即便如此,考虑到程序的其余部分几乎没有什么,它也可以管理超过 300 个。

如何找出我的程序有多少内存可用以确认它已用完?有足够的内存和免费交换,所以大概是操作系统(Linux)施加的人为限制。

谢谢

0 投票
1 回答
913 浏览

embedded - pthread_cancel 在 arm 和 ppc 上的行为不同?

我目前正在开发一个多线程应用程序,该应用程序将部署在 arm 和 ppc 架构上。我对手臂上的 pthread_cancel 有一些问题。

arm 上的 pthread_cancel 与 ppc 的行为不同。线程被取消,但线程局部变量的析构函数没有在 arm 上调用。我还尝试明确定义通过 pthread_cleanup_push 安装的取消清理处理程序例程。但是当线程被取消时它不会被调用。

该代码适用于 ppc。当线程被取消时,将调用局部变量的析构函数。当我明确定义一个清理处理程序时,它在调用 pthread_cancel 时被调用并执行。

我错过了什么吗?也许一些编译器选项?

  • 编程语言:C++
  • 编译器:arm-linux-g++/powerpc-linux-g++
  • 操作系统:Linux

编辑:

我在这个libc bug上发现了一种类似的问题。

使用 gcc 而不是 g++ 并添加 -fno-exception 编译器选项就可以了。但我真的很想了解这个问题背后的东西。此外,-fno-exception 意味着我将无法在我的应用程序中执行异常处理,并不是说我现在正在使用它,但我可能会在将来使用它。

谢谢。