之间有什么区别吗?
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
或
pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);
如果我只使用第一种方法,我是否足够安全?
注意:我的问题主要是指非常小的程序,我最多可以将多个客户端连接到服务器并使用工作线程解决他们的查询。
答案 0 :(得分:62)
对于旧版本的POSIX标准,第一个带初始化程序的方法只能保证使用静态分配的变量,而不是当变量是函数体中定义的auto
变量时。虽然我从未见过这样的平台,即使对于auto
变量也不允许这样做,并且在最新版本的POSIX标准中已经删除了此限制。
如果可能的话,static
变体是非常可取的,因为它允许更容易地编写引导代码。无论何时在运行时输入使用此类互斥锁的代码,都可以确保互斥锁已初始化。这是多线程环境中的宝贵信息。
当您需要互斥锁的特殊属性时,使用init函数的方法更可取,例如递归,例如在进程之间共享,而不仅仅是在线程之间共享。
答案 1 :(得分:6)
您可以使用动态初始化设置互斥锁的更多属性,如果在运行时添加一堆互斥锁,则只能使用动态方法。
如果符合您的需要,静态方法没有任何问题。
答案 2 :(得分:3)
如果默认互斥锁属性合适,宏PTHREAD_MUTEX_INITIALIZER可用于初始化互斥锁。
如果要为互斥锁指定属性,请使用动态初始化........
效果应等同于通过调用pthread_mutex_init()进行动态初始化,参数attrspecified为NULL,但不执行错误检查。
答案 3 :(得分:3)
我想引用这个book:
使用
POSIX
个线程,有两种方法可以初始化锁。单程 要做到这一点,请使用PTHREAD_MUTEX_INITIALIZER
,如下所示:pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
这样做会将锁定设置为默认值,从而进行锁定 可用。执行此操作的动态方法(即在运行时)是调用
pthread_mutex_init()
,如下所示:int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!
此例程的第一个参数是锁本身的地址,而第二个参数是一组可选的属性。阅读有关属性的更多信息 自己;传递NULL只是使用默认值。 无论哪种方式都可以,但是 我们通常使用动态(后者)方法。