pthread_mutex_lock和EAGAIN
我在多线程程序中使用了pthread,出现了以下情况。 当我在没有sleep命令的情况下运行代码时,它会在运行时导致错误,当我添加sleep命令时,程序会按预期运行 睡眠: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
#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在这里失败,因为锁定失败,但线程观察到互斥锁在系统调用之后但在它能够睡眠之前被解锁。