[英]How to cleanly instantiate a global mutex that is shared by threads in one of the threads itself
我使用GLib / GObject并面临以下问题:
我有一个my_class
类,它将在运行时在多个线程中具有多个对象实例,其中每个对象都将存在于单个线程中(因此线程与对象之间存在1:1关系)。
但是,对象将访问共享资源,并且我需要锁定以保护对该资源的访问。 现在,我需要一个全局互斥锁(GLib世界中的GMutex
)实例,所有线程/对象都可以使用该实例来锁定。
我当前的方法是在生成线程之前创建该互斥锁,并在构造函数中传递该全局互斥锁。 但是我不喜欢这种方法。 在创建线程之前,互斥锁与调用代码my_class
,它仅是my_class
功能所my_class
,因此,对于干净的OO设计, my_class
仅应是my_class
一部分。
但是如何从my_class
内部创建单个互斥锁? 我可以创建一个static GMutex *global_mutex
并将其作为全局变量,并在所有线程之间共享。 但是何时/如何调用g_mutex_new()
? 我想在my_class
的构造函数中使用my_class
,但是代码只需要运行一次。 为了实现这一点,我首先需要锁定,并且我面临着Chicken-Egg问题。
您想要的是GStaticMutex
。 在线程函数中将其声明为静态局部变量,然后使用G_STATIC_MUTEX_INIT
对其进行初始化:
static GStaticMutex my_mutex = G_STATIC_MUTEX_INIT;
它声明,定义和初始化互斥锁,因此可以直接使用它。
请参阅链接参考中的示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.