【问题标题】:Static initialization of mtx_t using threads.h使用threads.h静态初始化mtx_t
【发布时间】:2013-12-04 22:47:59
【问题描述】:

threads.h 仅支持使用mtx_init() 进行动态互斥体初始化。

显然互联网上没有任何关于threads.h的信息,除了:http://en.cppreference.com/w/c/thread。(我真的很想知道是否还有更多信息)

有人知道threads.h 中的struct mtx_t 是如何实现的吗? 我想像在 pthreads ( PTHREAD_MUTEX_INITIALIZER ) 中一样静态地初始化互斥锁,以避免每次在程序开始时调用初始化函数。

【问题讨论】:

  • threads.h 只是接口,各种实现可能以非常不同的方式实现互斥锁,只要它的行为像 C11 要求的那样。
  • 顺便说一句,最新的 POSIX 标准取消了初始化器的限制,只能在静态上下文中使用。它现在适用于任何存储类,尤其是 auto 变量。

标签: c multithreading pthreads c11


【解决方案1】:

C11 threads.h 无法在不调用 mtx_init() 的情况下初始化互斥锁

threads.h 在不同平台上的实现方式不同 - 因此了解 mtx_t 实际外观的实现细节并没有多大用处,如果存在本地线程 api,您也可以使用它,例如 pthreads 确实提供了这种能力。

【讨论】:

  • 所以两个线程同时初始化可能会破坏 mtx,因为没有办法 mtx_lock 实际的 mtx_init。唯一的方法是在创建线程之前调用 init。
  • @self 如果两个线程需要初始化相同的互斥锁,是的。尽管在这种情况下,互斥锁通常是一个全局变量,因为让 2 个线程初始化同一个互斥锁是有意义的——一个也可以在创建这些线程之前对其进行初始化。还有另一种可能性,即使用call_once() 函数调用另一个函数,该函数以无竞争方式初始化互斥锁,确保该函数只被调用一次。
  • @nos,C11 线程有更多可能进行初始化。 atomic_flag 或其他 _Atomic 作为辅助数据也可以解决这个令人遗憾的缺少静态初始化程序的问题。这些(原子)提供了这样的静态初始化器。
  • @JensGustedt call_once 可能适用于初始化互斥锁,但我认为它可能不会阻止在某些线程中立即调用未初始化的互斥锁。
  • @self 这就是为什么您必须重写该代码以使用 call_once() 或调用在该代码之前运行的 mtx_init() ,例如在启动线程之前在 main() 中。
猜你喜欢
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 2011-01-26
  • 2020-02-05
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多