【问题标题】:PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init ( &mutex, param)PTHREAD_MUTEX_INITIALIZER 与 pthread_mutex_init ( &mutex, param)
【发布时间】:2012-12-28 12:10:17
【问题描述】:

有什么区别

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

或者

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

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

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

【问题讨论】:

    标签: c ubuntu pthreads mutex


    【解决方案1】:

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

    如果可以的话,static 变体确实更可取,因为它可以更轻松地编写引导代码。每当您在运行时输入使用此类互斥锁的代码时,您都可以确保互斥锁已被初始化。这是多线程上下文中的宝贵信息。

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

    【讨论】:

      【解决方案2】:

      我想引用这个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 只是使用默认值。 任何一种方式都有效,但是 我们通常使用动态(后者)的方法。

      【讨论】:

        【解决方案3】:

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

        不过,如果符合您的需要,静态方法没有任何问题。

        【讨论】:

        • " 另外,如果您在运行时添加一堆互斥锁,则只能使用动态方法。“那么,这是什么意思?不方便解释的小例子?
        • @Kalec:如果您的互斥锁是由malloc() 分配的(或属于已分配的对象)。
        • @Kalec 如果互斥变量“lock”是结构的一部分,那么我们不能遵循第一种方法。我们必须使用 pthread_init()。
        【解决方案4】:

        在默认互斥体属性合适的情况下,宏 PTHREAD_MUTEX_INITIALIZER 可用于初始化互斥体。

        如果你想为互斥量指定属性,请使用动态初始化........

        效果应等同于通过调用 pthread_mutex_init() 进行动态初始化,参数 attr 指定为 NULL,但不执行错误检查。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-07
          • 1970-01-01
          • 2012-07-24
          • 2011-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多