pthread_mutex_lock和EAGAIN

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pthread_mutex_lock和EAGAIN相关的知识,希望对你有一定的参考价值。

我使用pthread进行多线程程序,我有以下情况。当我在没有睡眠命令的情况下运行代码时,它会在运行时导致错误,并且当我添加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
");
  pthread_mutex_lock(&m_writer);
  printf("LOL
");
  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
");
  pthread_mutex_lock(&m_writer);
  printf("LOL
");
  pthread_mutex_unlock(&m_writer);
  pthread_join(t1, NULL);
  return 0;
}

错误:

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

答案

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

特别是,pthread_mutex_lock在这个程序中不可能导致EAGAIN,因为没有尝试递归锁定互斥锁,并且默认的互斥锁在Linux中不是递归的。 FUTEX_WAIT_PRIVATE内部使用的pthread_mutex_lock系统调用可以并将导致EAGAIN。这对应用程序员来说无关紧要。

以上是关于pthread_mutex_lock和EAGAIN的主要内容,如果未能解决你的问题,请参考以下文章

哪些系统将 EAGAIN 和 EWOULDBLOCK 定义为不同的值?

Linux编程下EAGAIN和EINTR宏的含义及处理

读取套接字:EAGAIN:资源暂时不可用

ZMQ 扩展请求回复中的 EAGAIN

pthread_join 和 pthread_mutex_lock 有啥区别?

pthread_cond_wait 和 pthread_mutex_lock 优先级?