pthread互斥锁 - 它会定期检查还是操作系统将其唤醒

时间:2018-03-16 12:01:43

标签: c++ linux multithreading posix

如果Thread1试图锁定由Thread2锁定的资源。 它会在有限的时间内睡觉吗?

现在,如果Thread2解锁了互斥锁,那么Thread1将如何知道该资源是否可用?操作系统是否会将其唤醒或定期检查资源?

2 个答案:

答案 0 :(得分:2)

你的第二个假设是正确的。当一个互斥锁已被一个线程锁定时,所有试图再次锁定它的剩余线程将被置于保持状态并处于休眠状态。一旦互斥锁被解锁,O / S就会将它们全部唤醒,并且可以先解锁的人可以访问该锁。这不是基于FIFO的,实际上没有规则哪个线程一旦被唤醒就应首先锁定互斥锁。您可以考虑我的下面示例,其中我使用条件变量来控制线程: -

pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond3 = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock3 = PTHREAD_MUTEX_INITIALIZER;

int TRUE = 1;

void print(char *p)
{
  printf("%s",p);
}

void * threadMethod1(void *arg)
{
  printf("In thread1\n");
  do{
    pthread_mutex_lock(&lock1);
    pthread_cond_wait(&cond1, &lock1);
    print("I am thread 1st\n");
    pthread_cond_signal(&cond3);/* Now allow 3rd thread to process */
    pthread_mutex_unlock(&lock1);
  }while(TRUE);
  pthread_exit(NULL);
}

void * threadMethod2(void *arg)
{
  printf("In thread2\n");
  do
  {
    pthread_mutex_lock(&lock2);
    pthread_cond_wait(&cond2, &lock2);
    print("I am thread 2nd\n");
    pthread_cond_signal(&cond1);
    pthread_mutex_unlock(&lock2);
  }while(TRUE);
  pthread_exit(NULL);
}

void * threadMethod3(void *arg)
{
  printf("In thread3\n");
  do
  {
    pthread_mutex_lock(&lock3);
    pthread_cond_wait(&cond3, &lock3);
    print("I am thread 3rd\n");
    pthread_cond_signal(&cond2);
    pthread_mutex_unlock(&lock3);
  }while(TRUE);
  pthread_exit(NULL);
}

int main(void)
{
  pthread_t tid1, tid2, tid3;
  int i = 0;

  printf("Before creating the threads\n");
  if( pthread_create(&tid1, NULL, threadMethod1, NULL) != 0 )
        printf("Failed to create thread1\n");
  if( pthread_create(&tid2, NULL, threadMethod2, NULL) != 0 )
        printf("Failed to create thread2\n");
  if( pthread_create(&tid3, NULL, threadMethod3, NULL) != 0 )
        printf("Failed to create thread3\n");
  pthread_cond_signal(&cond1);/* Now allow first thread to process first */


  sleep(1);
  TRUE = 0;/* Stop all the thread */
  sleep(3);

 /* this is how we join thread before exit from a system */
  /*  
  pthread_join(tid1,NULL);
  pthread_join(tid2,NULL);
  pthread_join(tid3,NULL);*/

 exit(0);
}

这里我使用3个互斥锁和3个条件。通过上面的示例,您可以在C中调度/控制或优先处理任意数量的线程。如果您在此处看到第一个线程,则锁定了互斥锁1并等待cond1,同样第二个线程锁定了互斥锁lock2并等待条件cond2和第3个线程锁定的互斥锁lock3并在cond3条件下等待。这是创建它们之后所有线程的当前情况,现在所有线程都在等待信号在其条件变量上进一步执行。在主线程中(即main函数,每个程序都有一个主线程,在C / C ++中这个主线程由操作系统自动创建,一旦控制传递给kernal的main方法)我们调用pthread_cond_signal(& cond1);一旦这个系统调用完成,在cond1上等待的thread1将被释放,它将开始执行。一旦完成任务,它将调用pthread_cond_signal(& cond3);现在正在等待条件cond3的线程,即thread3将被释放,它将开始执行并将调用pthread_cond_signal(& cond2);这将释放在条件cond2上等待的线程,即在这种情况下为thread2。

答案 1 :(得分:0)

有关互斥锁的基本信息(多重排除锁定)

互斥锁是一种特殊的锁,一次只能锁定一个线程。如果线程锁定互斥锁,然后第二个线程也尝试锁定相同的互斥锁,则第二个线程被阻塞或保持不变。只有当第一个线程解锁互斥锁时,第二个线程才会被解锁 - 允许继续执行。

  • Linux保证在尝试锁定互斥锁的线程之间不会出现竞争条件;只有一个线程会获得锁定,所有其他线程都将被阻止。

  • 线程可能会尝试通过调用pthread_mutex_lock来锁定互斥锁。如果互斥锁被解锁,它将被锁定并且函数立即返回。

试图锁定其被另一个线程锁定的时间会发生什么?

如果互斥锁被另一个线程锁定,pthread_mutex_lock会阻止执行并最终仅在互斥锁解锁互斥锁时返回。