【问题标题】:Does pthread_once_t variable need a mutex?pthread_once_t 变量是否需要互斥锁?
【发布时间】:2011-09-06 21:22:24
【问题描述】:

我们对 pthread 使用一次性初始化,如下所示:

/* define a statically initialized pthread_once_t variable */
pthread_once_t once_var = PTHREAD_ONCE_INIT;

/* we call pthread_once function in threads */
int pthread_once(pthread_once_t *once_control, void (*init)(void));

当多个线程要改变pthread_once_t变量的状态时,我们是否需要一个互斥锁来保护它?

【问题讨论】:

    标签: c pthreads mutex


    【解决方案1】:

    不,您不需要为此使用互斥锁。 pthread_once 调用 (link here) 保证只执行一次,即使多个线程同时尝试。

    once_var 保护调用不被多次执行。它将按预期工作,前提是您:

    • once_var初始化为PTHREAD_ONCE_INIT;和
    • 确保once_var 不是自动存储持续时间(例如,在堆栈上);和
    • 让所有线程使用相同的once_var 变量。

    【讨论】:

    • 为什么需要确保once_var不是自动的?只要它在整个可能使用期间保持在范围内,它就应该可以正常工作。
    • @R:因为这是手册页所说的 :-) 如果变量是自动的,则这是未定义的行为。它可能起作用,UB 有时会起作用,但这并不意味着依赖它是一个明智的决定,就像 ISO C 标准中的 UB 一样。我怀疑它超出他们担心的范围的可能性,但我不确定。
    【解决方案2】:

    pthread_once 是线程安全的。在这种情况下,您可以将 pthread_once_t 变量视为互斥体。

    【讨论】:

      【解决方案3】:

      如果是这样,整个机制将毫无用处。无论您使用什么来确保只初始化该互斥锁一次,都可以轻松地执行您正在使用 this 机制执行一次的任何操作。

      【讨论】:

        猜你喜欢
        • 2015-10-31
        • 1970-01-01
        • 1970-01-01
        • 2010-09-12
        • 2011-12-01
        • 2016-09-30
        • 1970-01-01
        • 1970-01-01
        • 2012-05-25
        相关资源
        最近更新 更多