Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pthread_mutex_lock和EAGAIN_C_Multithreading_Pthreads_Strace_Futex - Fatal编程技术网

pthread_mutex_lock和EAGAIN

pthread_mutex_lock和EAGAIN,c,multithreading,pthreads,strace,futex,C,Multithreading,Pthreads,Strace,Futex,我在多线程程序中使用了pthread,出现了以下情况。 当我在没有sleep命令的情况下运行代码时,它会在运行时导致错误,当我添加sleep命令时,程序会按预期运行 睡眠: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <pthread.h> #include <unistd.h> pthread_mutex_t m_writer = PTHRE

我在多线程程序中使用了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;
}
#包括
#包括
#包括
#包括
#包括
pthread_mutex_t m_writer=pthread_mutex_初始值设定项;
void*print_str(void*args){
睡眠(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,字符**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);
返回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;
}
#包括
#包括
#包括
#包括
#包括
pthread_mutex_t m_writer=pthread_mutex_初始值设定项;
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,字符**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);
返回0;
}
错误:

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


strace
显示系统调用的结果。Linux中的Pthread函数不是系统调用,它们是在系统调用之上实现的libc函数。您对内部系统调用返回的内容不感兴趣。对
ptread\u mutex\u lock
的一次成功调用可能有时会导致多次失败的系统调用


特别是,
pthread\u mutex\u lock
不可能在该程序中导致
EAGAIN
,因为没有递归锁定互斥体的尝试,并且默认互斥体在Linux中也不是递归的。
pthread\u mutex\u lock
内部使用的
FUTEX\u WAIT\u PRIVATE
系统调用可能会导致
EAGAIN
。应用程序程序员对此不感兴趣。

strace
显示系统调用的结果。Linux中的Pthread函数不是系统调用,它们是在系统调用之上实现的libc函数。您对内部系统调用返回的内容不感兴趣。对
ptread\u mutex\u lock
的一次成功调用可能有时会导致多次失败的系统调用


特别是,
pthread\u mutex\u lock
不可能在该程序中导致
EAGAIN
,因为没有递归锁定互斥体的尝试,并且默认互斥体在Linux中也不是递归的。
pthread\u mutex\u lock
内部使用的
FUTEX\u WAIT\u PRIVATE
系统调用可能会导致
EAGAIN
。应用程序程序员对此不感兴趣。

EAGAIN-无法获取互斥锁,因为已超过互斥锁的最大递归锁数。当您睡眠时,主函数线程在被另一个线程锁定之前成功地锁定和解锁互斥锁。在两段不同的代码(共享源代码)中使用一个互斥体。总的来说,这是错误的。如果您想测试printf缓冲队列,那么创建两个单独的线程,它们将调用print_str。您如何知道有错误?你的代码没有检查错误。我已经用strace检查过了。@n.m.@Ivanov互斥锁保护共享资源不被并发访问。代码中有多少地方试图访问资源并不重要。如果是同一个资源,它应该是同一个互斥锁。太好了,现在扔掉你的strace日志,因为它没有意义,在code.EAGAIN中插入错误检查-无法获取互斥锁,因为已超过互斥锁的最大递归锁数。当您睡眠时,主函数线程在被另一个线程锁定之前成功地锁定和解锁互斥锁。在两段不同的代码(共享源代码)中使用一个互斥体。总的来说,这是错误的。如果您想测试printf缓冲队列,那么创建两个单独的线程,它们将调用print_str。您如何知道有错误?你的代码没有检查错误。我已经用strace检查过了。@n.m.@Ivanov互斥锁保护共享资源不被并发访问。代码中有多少地方试图访问资源并不重要。如果它是同一个资源,它应该是同一个互斥体。很好,现在扔掉你的strace日志,因为它没有意义,并在代码中插入错误检查。值得补充的是,
futex
syscall在这里失败,因为锁定失败,但线程观察到,互斥锁在系统调用之后但在它能够睡眠之前被解锁。值得补充的是,
futex
syscall在这里失败,因为锁定失败,但线程观察到互斥锁在系统调用之后但在它能够睡眠之前被解锁。