gpt4 book ai didi

c - pthread_mutex_lock 和 EAGAIN

转载 作者:太空宇宙 更新时间:2023-11-04 01:19:22 24 4
gpt4 key购买 nike

我已经将 pthread 用于多线程程序,并且遇到了以下情况。当我在没有 sleep 命令的情况下运行代码时,它会在运行时导致错误,而当我添加 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;
}

没有 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) {
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 (Resource temporarily unavailable)

最佳答案

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

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

关于c - pthread_mutex_lock 和 EAGAIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48090165/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com