gpt4 book ai didi

c - pthread_cond_signal() 中的段错误

转载 作者:太空狗 更新时间:2023-10-29 12:22:58 26 4
gpt4 key购买 nike

首先让我提供一些背景知识。生产代码中有两个线程,同步是通过等待和信号完成的。下面给出代码的基本结构。 main.c 创建线程。 main.c 还调用 funca() 向另一个线程发出信号。互斥量和条件变量在 a.c 中声明和初始化。 a.c还有funca()的定义和thread_func()的定义。 thread_func() 等待条件并在收到信号后解锁互斥锁并做一些工作。

主.c

pthread_create(thread_id, thread_func)

funca();

a.c

pthread_mutex_t     renotify_signal_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t renotify_signal_cond = PTHREAD_COND_INITIALIZER;

thread_func() {
pthread_mutex_lock(&renotify_signal_mutex);
pthread_cond_wait(&renotify_signal_cond, &renotify_signal_mutex);
pthread_mutex_unlock(&renotify_signal_mutex);

<<<<< Does some work here
}

funca() {

pthread_mutex_lock(&renotify_signal_mutex);
pthread_cond_signal(&renotify_signal_cond);
pthread_mutex_unlock(&renotify_signal_mutex);

}

段错误出现在 pthread_cond_siganl() 中。在 gdb 中检查后,我可以看到条件变量绑定(bind)到的互斥锁已损坏,即地址应该是 signal_mutex 的地址,但实际上它指向无效内存。请查看下面的 gdb 输出:

(gdb) x/40 0x85084a0
0x85084a0 <renotify_signal_mutex>: 0x00000001 0x00000000 0x00003b1a 0x00000000
0x85084b0 <renotify_signal_mutex+16>: 0x00000002 0x00000000 0x00000000 0x00000000
0x85084c0 <renotify_signal_cond>: 0x00000001 0x00000008 0x00000004 0x00000000
0x85084d0 <renotify_signal_cond+16>: 0x00000004 0x00000000 0x00000003 0x00000000
0x85084e0 <renotify_signal_cond+32>: 0x0200a084 0x00005008 0x00000000 0x00000000
0x85084f0 <_breakpoint_target_>: 0x00000000 0x00000000 0x00000000 0x00000000
0x8508500 <bgp_asn_buffer>: 0x00000000 0x00000000 0x00000000 0x00000000
0x8508510 <bgp_asn_buffer+16>: 0x00000000 0x00000000 0x00000000 0x00000000
0x8508520 <bgp_asn_buffer+32>: 0x00000000 0x00000000 0x00000000 0x00000000
0x8508530 <bgp_asn_buffer+48>: 0x00000000 0x00000000 0x00000000 0x00000000
(gdb) p renotify_signal_cond
$51 = {
__data = {
__lock = 1,
__futex = 8,
__total_seq = 4,
__wakeup_seq = 4,
__woken_seq = 3,
__mutex = 0x200a084,
__nwaiters = 20488,
__broadcast_seq = 0
},
__size = "\001\000\000\000\b\000\000\000\004\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\204\240\000\002\bP\000\000\000\000\000\000\000\000\000",
__align = 34359738369
}
gdb) x 0x200a084
0x200a084: Cannot access memory at address 0x200a084
(gdb)


(gdb) p &renotify_signal_mutex
$53 = (pthread_mutex_t *) 0x85084a0 <renotify_signal_mutex>

正如您在 gdb 输出中看到的,pthread_cond_t 结构中的互斥量字段指向无效内存,而不是指向 renotify_signal_mutex。 __nwaiters = 20488 看起来也不对。

从内存转储中我看不到任何内存覆盖的可能性。我也没有看到任何可能导致这种情况的使用未初始化的互斥锁/条件的可能性。有人可以帮我解决这个问题吗?

谢谢

最佳答案

这可能是您的代码示例中的一种简化,但 pthread_create 看起来不正确。 pthread_create 的格式为:

int pthread_create(
pthread_t *线程,
const pthread_attr_t *attr,
void *(*start_routine)(void *),
void *arg);

这可能会损坏内存。此外,thread_func 应作为 &thread_func 传递给 pthread_create。

关于c - pthread_cond_signal() 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52557637/

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