我使用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\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(资源暂时不可用)
答案 0 :(得分:4)
strace
显示系统调用的结果。 Linux中的Pthread函数不是系统调用,它们是在(非常重要的)系统调用之上实现的libc函数。您对内部系统调用返回的内容不感兴趣。对ptread_mutex_lock
的单次成功调用可能并且有时会导致多次失败的系统调用。
特别是,pthread_mutex_lock
在这个程序中不可能导致EAGAIN
,因为没有尝试递归锁定互斥锁,并且默认的互斥锁在Linux中不是递归的。 FUTEX_WAIT_PRIVATE
内部使用的pthread_mutex_lock
系统调用可以并将生成EAGAIN
。这对应用程序员来说无关紧要。