繁体   English   中英

如何干净地实例化一个线程本身中的线程共享的全局互斥锁

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM