【问题标题】:Mutex and order of execution互斥量和执行顺序
【发布时间】:2022-01-08 07:01:08
【问题描述】:

首先,我对 posix 编程还很陌生,并且仍然了解基本概念。我仍然不太清楚pthread_mutex_lock pthread_mutex_unlock 工作。

#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <pthread.h>
#inlcude <stdio.h>
pthread_mutex_t_mtx;
void* routine(void* i){
    int j;
    for(j = 0; j < 1000000; ++j){
         pthread_mutex_lock(&mtx);
         printf("Inside thread %d\n", i);
         pthread_mutex_unlock(&mtx);
    }
    return NULL;
}

int main()
{
   pthread_t th[3];
   int i;
   pthread_mutex_init(&mtx, NULL);
   for(i = 1; i <= 2; ++i)
   {
      if(pthread_create(th + i, NULL, routine, i){
           perror(NULL);  return 1;
      }
   }

   for(i = 1; i <=2; ++i)
        pthread_join(th[i], NULL);

   return 0;
}

上述程序的正确输出应该是什么?我认为由于互斥锁的锁定和解锁,会有 2000000 次迭代,但我不太清楚它们完成的顺序。第一个线程是否执行 for 的前 1000000 步?它甚至执行 20000000 中的第一个吗?还是因为秩序更加混乱?

【问题讨论】:

  • 鉴于void *iprintf("Inside thread %d\n", i); 是错误的。 void * 的正确格式说明符是 %p

标签: c unix posix mutex


【解决方案1】:

假设互斥锁是一个全局的,你会得到 2000000 条消息,每个线程有 1000000 条消息。这些顺序是随机的,但是它们不会相互干扰,因为每个打印都受到互斥锁的保护

编辑:我刚刚注意到,您是在创建下一个线程之前加入的。因此首先会有第一个线程的所有消息,然后是第二个线程的所有消息。在这种情况下,互斥锁完全没有效果。排序的原因很简单,您不会同时运行一个以上的工作线程。

【讨论】:

  • 他们不会互相干扰是什么意思?
  • 如果您同时从两个线程调用 printf,假设 print("AA") 和 printf("BB"),那么您可以获得输出 ABAB,因为两个线程都可以同时写入终端。这种竞争条件可以通过互斥锁来防止。但是,在您的情况下,一次只能运行一个线程(除了主线程)
  • pthread_join 是偶然的。我还有一个问题。迭代中的变量j不会受到同时修改它的两个线程的影响吗?
  • 不,因为变量在每个线程中都是本地的(每个线程都有自己的副本)。如果它是一个全局变量,那么是的,你会有一个竞争条件。
  • 但是线程不共享相同的“内存空间”吗?还是仅适用于全局变量?对不起,如果这个问题很愚蠢,但我真的很想理解......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
相关资源
最近更新 更多