1

我已经将 pthread 用于多线程程序,并且遇到以下情况。当我在没有 sleep 命令的情况下运行代码时,它会在运行时导致错误,并且当我添加 sleep 命令时,程序会按预期运行。

与睡眠:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <pthread.h>
#include <unistd.h>



pthread_mutex_t m_writer = PTHREAD_MUTEX_INITIALIZER;

void *print_str(void *args) {
  sleep(12);
  char *str = (char*) args;
  pthread_mutex_lock(&m_writer);
  printf("%s", str);
  pthread_mutex_unlock(&m_writer);
  pthread_exit(NULL);
}

int main(int argc, char **argv) {
  pthread_t t1;
  pthread_create(&t1, NULL, print_str, "Hello\n");
  pthread_mutex_lock(&m_writer);
  printf("LOL\n");
  pthread_mutex_unlock(&m_writer);
  pthread_join(t1, NULL);
  return 0;
}

不睡觉:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <pthread.h>
#include <unistd.h>



pthread_mutex_t m_writer = PTHREAD_MUTEX_INITIALIZER;

void *print_str(void *args) {
  char *str = (char*) args;
  pthread_mutex_lock(&m_writer);
  printf("%s", str);
  pthread_mutex_unlock(&m_writer);
  pthread_exit(NULL);
}

int main(int argc, char **argv) {
  pthread_t t1;
  pthread_create(&t1, NULL, print_str, "Hello\n");
  pthread_mutex_lock(&m_writer);
  printf("LOL\n");
  pthread_mutex_unlock(&m_writer);
  pthread_join(t1, NULL);
  return 0;
}

错误:

futex(0x559c3d3df0a0, FUTEX_WAIT_PRIVATE, 2, NULLHello ) = -1 EAGAIN (资源暂时不可用)

4

1 回答 1

5

strace显示系统调用的结果。Linux 中的 Pthread 函数不是系统调用,它们是在(可能不平凡的)系统调用之上实现的 libc 函数。您对内部系统调用返回的内容不感兴趣。一次成功的调用ptread_mutex_lock可能并且有时确实需要多次失败的系统调用。

特别是,pthread_mutex_lock不可能导致EAGAIN这个程序,因为没有尝试以递归方式锁定互斥锁,并且默认互斥锁在 Linux 中无论如何都不是递归的。内部使用的FUTEX_WAIT_PRIVATE系统调用pthread_mutex_lock可以并且将导致EAGAIN. 应用程序程序员对此毫无兴趣。

于 2018-01-04T07:42:15.907 回答