Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用threads.h静态初始化mtx\u t_C_Multithreading_Pthreads_C11 - Fatal编程技术网

C 使用threads.h静态初始化mtx\u t

C 使用threads.h静态初始化mtx\u t,c,multithreading,pthreads,c11,C,Multithreading,Pthreads,C11,threads.h仅支持动态互斥体初始化 很明显,互联网上没有关于threads.h的任何信息,除了:。(我真的很想知道是否还有其他信息) 有人知道threads.h中的struct mtx\u t是如何实现的吗? 我希望像pthreads(PTHREAD_mutex_INITIALIZER)一样静态初始化互斥体,以避免每次在程序启动时调用初始化函数。C11 threads.h无法在不调用mtx_init()的情况下初始化互斥体 threads.h在不同平台上的实现方式不同-因此了解mtx的实际

threads.h
仅支持动态互斥体初始化

很明显,互联网上没有关于threads.h的任何信息,除了:。(我真的很想知道是否还有其他信息)

有人知道
threads.h
中的
struct mtx\u t
是如何实现的吗?
我希望像pthreads(PTHREAD_mutex_INITIALIZER)一样静态初始化互斥体,以避免每次在程序启动时调用初始化函数。

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


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

threads.h只是接口,不同的实现可能以非常不同的方式实现互斥,只要它的行为与C11要求相同。顺便说一句,最新的POSIX标准取消了初始值设定项仅在静态上下文中使用的限制。它现在对任何存储类都有效,特别是
auto
变量。因此,两个线程同时初始化可能会破坏mtx,因为无法锁定实际的mtx\u init。唯一的方法是在开始创建线程之前调用init。@self如果两个线程需要初始化同一个互斥锁,请选择“是”。尽管在这种情况下,互斥锁通常是一个globabl变量,因此让两个线程初始化同一互斥锁是有意义的——在创建这些线程之前,最好先初始化互斥锁。还有一种可能性,就是使用
call_once()
函数调用另一个函数,该函数以无争用的方式初始化互斥锁,以确保该函数只被调用一次。@不,C11线程还有一些初始化的可能性
atomic_flag
或其他
\u atomic
作为辅助数据,也有可能解决这个令人遗憾的缺乏静态初始值设定项的问题。这些(原子)提供了这样的静态初始值设定项。@JensGustedt可能可以初始化互斥体,但我认为这可能不会阻止在某些线程中立即调用未初始化的互斥体。@self这就是为什么您必须重写该代码以使用call_once()或调用在该代码之前运行的mtx_init(),例如在main()中)在开始线程之前。