【问题标题】:How can I ensure two threads executing the same function to be mutually exclusive如何确保执行相同功能的两个线程互斥
【发布时间】:2010-04-23 15:59:05
【问题描述】:

两个线程将使用相同的func()。这两个线程应该是互斥的。如何让它正常工作?

(输出应为“abcdeabcde”)

char arr[] = "ABCDE";
int len = 5;

void func() {
    for(int i = 0; i <len;i++)
        printf("%c",arr[i]);
}

【问题讨论】:

  • 不!它让我困扰
  • 为什么不只是printf("%s", arr)
  • printf 中的内容并不重要,我只是想知道我是否可以使用线程安全的基本代码
  • @Vlad:因为您的代码要求数组以 nul 结尾,而提问者的代码不需要?这显然只是一个例子,你不妨说“为什么不完全摆脱 arr 和 len 而只做 printf("ABCDE"); ”;-)
  • @Steve: AFAIK 字符串"ABCDE" 隐式以空值终止。恕我直言,使用 printf(s) 而不是 printf("%s", s)(即使对于字符串常量 s)是一种不好的风格,因为它默默地假设 s 不包含特定于 printf 的控制字符,(1)可能不是将来的情况,并且 (2) 没有记录在案,因此很容易被开发人员忽略。

标签: c++ c mutex


【解决方案1】:

创建互斥锁?假设您使用的是 pthread,

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

....

void func() {
    int errcode = pthread_mutex_lock(&mutex);
    // deal with errcode...
    // printf...
    errcode = pthread_mutex_unlock(&mutex);
    // deal with errcode...
}

有关教程,请参阅 https://computing.llnl.gov/tutorials/pthreads/#Mutexes

【讨论】:

  • 我可以用基本代码吗?像一会儿还是如果?还是我必须使用特殊功能?
  • 你必须使用特殊说明——阅读原子性。
  • @nisnis:不,您必须使用特殊功能。基本代码不是线程感知的(某些语言有一个特殊的 synchronize/lock 块用作互斥锁,但不是 whileif。)
【解决方案2】:
  1. 在主线程中,初始化 mutex m。
  2. 在主线程中,创建两个线程,它们都从某个函数 x() 开始。
  3. 在 x() 中,获取互斥体 m。
  4. 在 x() 中,调用 func()。
  5. 在 x() 中,释放互斥体 m。

【讨论】:

    【解决方案3】:

    既然您标记了这个 C++,您应该知道 C++11 包含专门用于处理锁定的标准库功能。

    std::mutex std::lock_guard

    #include <mutex>
    
    std::mutex arr_mutex;
    char arr[] = "ABCDE";
    int len = 5;
    
    void func() {
        // Scoped lock, which locks mutex and then releases lock at end of scope.
        // Classic RAII object.
        std::lock_guard<std::mutex> lock(arr_mutex);
    
        for(int i = 0; i <len;i++)
            printf("%c,arr[i]);
    }
    

    【讨论】:

    • C++11 从 2010 年开始? ;-)
    猜你喜欢
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多