当前位置: 首页>>技术问答>>正文


PTHREAD_MUTEX_INITIALIZER与pthread_mutex_init(& mutex,param)

, , ,

问题描述

两者之间有什么区别吗?

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

要么

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

如果我只使用第一种方法,我是否足够安全?

注意:我的问题主要是指非常小的程序,我最多会将几个客户端连接到服务器并使用工作线程解决它们的查询。

最佳解决办法

对于旧版本的POSIX标准,第一个带有初始化程序的方法只能保证使用静态分配的变量,而不是当变量是在函数体中定义的auto变量时。虽然我从未见过这样的平台,即使对于auto变量也不允许这样做,并且在最新版本的POSIX标准中已经删除了这一限制。

如果可以的话,static变体是非常可取的,因为它允许更容易地编写引导代码。无论何时在运行时输入使用此类互斥锁的代码,都可以确保互斥锁已初始化。这是multi-threading上下文中的宝贵信息。

当您需要互斥锁的特殊属性时,使用init函数的方法更为可取,例如递归,例如在进程之间可共享,而不仅仅是在线程之间。

次佳解决办法

您可以使用动态初始化设置互斥锁的更多属性,如果在运行时添加一堆互斥锁,则只能使用动态方法。

如果符合您的需求,那么静态方法没有任何问题。

第三种解决办法

如果默认互斥锁属性合适,宏PTHREAD_MUTEX_INITIALIZER可用于初始化互斥锁。

如果要为互斥锁指定属性,请使用动态初始化……..

通过调用pthread_mutex_init()并将参数attrspecified为NULL,该效果等效于动态初始化,除了不执行错误检查。

第四种办法

我想从这个book引用这个:

With POSIX threads, there are two ways to initialize locks. One way to do this is to use PTHREAD_MUTEX_INITIALIZER, as follows: pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Doing so sets the lock to the default values and thus makes the lock usable. The dynamic way to do it (i.e., at run time) is to make a call to pthread_mutex_init() as follows: int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!

The first argument to this routine is the address of the lock itself, whereas the second is an optional set of attributes. Read more about the attributes yourself; passing NULL in simply uses the defaults. Either way works, but we usually use the dynamic (latter) method.

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6561.html,未经允许,请勿转载。