gpt4 book ai didi

pthreads - 我可以在线程特定数据的析构函数中使用 pthread 互斥锁吗?

转载 作者:太空宇宙 更新时间:2023-11-03 14:21:09 27 4
gpt4 key购买 nike

我正在从一个由互斥锁控制的固定大小的全局池中分配我的 pthread 线程特定数据。 (有问题的代码不允许动态分配内存;它允许使用的所有内存都由调用者作为单个缓冲区提供。pthreads 可能会分配内存,我不能说,但这并不意味着我的代码是允许的。)

这在创建数据时很容易处理,因为该函数可以检查pthread_getspecific的结果:如果它返回NULL,那么全局池的互斥量就可以在那里获取然后,获取池条目,并使用 pthread_setspecific 设置值。

当线程被销毁时,析构函数(根据 pthread_key_create)被调用,但是 pthreads 手册对于可能存在的任何限制有点含糊。

(我不能对线程代码强加任何要求,例如需要它在退出前手动调用析构函数。所以,我可以保留分配的数据,并且可能将池视为某种缓存,重用一旦它变满,就基于 LRU 条目——这可能是我在 Windows 上使用 native API 时采用的方法——但最好是在每个线程被销毁时正确释放每线程数据。 )

我可以只在析构函数中使用互斥量吗?线程销毁被延迟一点没有问题,如果其他线程在那个时候获取了互斥量。但这能保证有效吗?我担心的是线程可能在那时“不再存在”。我使用引号,因为如果它仍在运行代码,它当然存在! -- 但它是否足够存在以允许获取互斥体?这在任何地方都有记录吗?

最佳答案

pthread_key_create() rationale似乎证明你可以从析构函数中做任何你想做的事情,只要你阻止信号处理程序调用 pthread_exit():

There is no notion of a destructor-safe function. If an application does not call pthread_exit() from a signal handler, or if it blocks any signal whose handler may call pthread_exit() while calling async-unsafe functions, all functions may be safely called from destructors.

但是请注意,这部分是信息性的,而不是规范性的。

线程的存在或不存在很可能不会影响互斥锁,除非互斥锁是错误检查的。即便如此,内核仍在调度正在运行析构函数的任何线程,因此绝对应该有足够的线程可以运行。

关于pthreads - 我可以在线程特定数据的析构函数中使用 pthread 互斥锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4200206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com