This question already has answers here:
How pthread_mutex_lock is implemented

(2个答案)


3年前关闭。




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

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

最佳答案

您的第二个假设是正确的。当互斥锁已经被某个线程锁定时,所有试图再次锁定该互斥锁的其余线程将被置于保留状态,并处于 sleep 状态。一旦互斥锁被解锁,操作系统就会将它们全部唤醒,谁先解锁就可以访问该锁。这不是基于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中任意数量的线程。如果在此处看到第一个线程锁定了互斥锁lock1并等待cond1,同样,第二个线程锁定了互斥锁lock2,并等待条件cond2和第三个线程锁定了互斥锁lock3并等待条件cond3。这是所有线程创建后的当前状态,现在所有线程都在等待信号进一步执行其条件变量。在主线程中(即主函数,每个程序都有一个主线程,在C/C++中,一旦内核将控制权传递给主方法,操作系统就会自动创建该主线程),我们在调用pthread_cond_signal(&cond1);一旦等待cond1的已完成系统调用的线程1被释放,它将开始执行。完成任务后,它将调用pthread_cond_signal(&cond3);。现在正在等待条件cond3的线程,即线程3将被释放,它将开始执行并调用pthread_cond_signal(&cond2);。这将释放在条件cond2(即本例中为thread2)中等待的线程。

关于c++ - pthread互斥锁-是否定期检查或操作系统将其唤醒,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49320307/

10-09 20:04
查看更多