- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
首先让我提供一些背景知识。生产代码中有两个线程,同步是通过等待和信号完成的。下面给出代码的基本结构。 main.c 创建线程。 main.c 还调用 funca() 向另一个线程发出信号。互斥量和条件变量在 a.c 中声明和初始化。 a.c还有funca()的定义和thread_func()的定义。 thread_func() 等待条件并在收到信号后解锁互斥锁并做一些工作。
pthread_create(thread_id, thread_func)
funca();
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/
我正在研究 Pthread 的条件变量。当我阅读 pthread_cond_signal 的解释时,我看到以下内容。 The pthread_cond_signal() function shall
我有几个线程,它们相互传递数据并对其进行一些处理。一旦我在最后两个线程之间进行同步,程序就开始崩溃。我对线程没有太多经验,所以我没有调试,而是评论了最后一个线程的全部内容,因此它只是在 while 循
我有以下代码为 N 个线程运行,计数 = 0 最初作为共享变量。每个变量都在线程工作之前初始化。我正在尝试仅为 MAX 线程数执行代码的关键部分。 void *tmain(){ while(1){
pthread_cond_signal 是否正好解除阻塞一个线程?如果不是,它会释放一个以上的线程是什么情况?规范是这样说的: The pthread_cond_signal() function s
我试图通过线程之间的同步(目前从 2 开始)来模拟上下文切换,以便每个线程充当一个进程,并且进程切换发生在每个 TIMESLICE 间隔(目前为 3 毫秒)。通过一次仅执行一个线程进行的线程切换运行得
嗨,我是 C 新手,正在尝试了解互斥体、条件和线程。我了解线程如何工作的基础知识。如果我错了,请纠正我,据我所知,一个线程正在等待另外两个线程发送信号以唤醒他。由于互斥体的原因,代码一次只能由一个线程
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
如果调用 pthread_cond_signal 死锁,可能是什么原因导致的? 据我了解(man page),它是在内部使用互斥锁实现的,但是什么会导致此内部互斥锁操作死锁? 编辑:我正在调试一个在某
调用 pthread_cond_signal 的线程在释放信号线程之前重新获取互斥体。 下面的代码显示了手头问题的一个简单示例。主线程将持有锁,创建工作线程,然后进入一个循环,在数据进入时打印数据。它
让我们假设有一个线程调用 pthread_cond_wait 并等待信号: pthread_mutex_lock(&m); ..... while(run) {
我需要启动一堆线程,并想优雅地将它们关闭。 我正在尝试使用 pthread_cond_signal/pthread_cond_wait 来实现此目的,但遇到了问题。 这是我的代码。首先是 thread
我有一个程序在其中一个线程调用 pthread_cond_siganl(或广播)时死锁。该问题在主程序中可 100% 重现。我无法弄清楚它有什么问题,因此提取了调用 wait 和 signal 的代码
当我在我的线程函数中调用“pthread_cond_signal”时,这个调用会解锁我当前使用的互斥量吗? (不是 pthread_cond_wait 正在等待的那个)。 最佳答案 只有给 pthre
当线程调用 pthread_cond_signal() 时,Unix 网络编程说 pthread_cond_signal() 只会通知一个线程,因为它不是 pthread_cond_broadcast
首先让我提供一些背景知识。生产代码中有两个线程,同步是通过等待和信号完成的。下面给出代码的基本结构。 main.c 创建线程。 main.c 还调用 funca() 向另一个线程发出信号。互斥量和条件
如果有多个线程在等待一个条件变量,那么在 pthread_cond_signal 上唤醒的顺序是什么。我读过 pthread_cond_signal 不一定按 sleep 顺序醒来。所以这可能会导致饥
我在某处读到我们应该在调用 pthread_cond_signal 之前锁定 mutex 并在调用之后解锁互斥锁: The pthread_cond_signal() routine isused t
关于这个: How To Use Condition Variable 假设我们有多个执行此类代码的消费者线程(从引用的页面复制): while (TRUE) { s = pthread_mu
我目前正在学习 POSIX 线程 (pthread)。 我现在创建了一个简单的程序,它将共享值增加 7 直到超过 10000,然后它应该向下一个线程发出条件信号,将其减少 3 直到低于 1000。最后
干杯, 我有 2 个线程导致逻辑死锁 => d_santa 和 d_patuljak(抱歉有些文章是用克罗地亚语写的,我没有时间翻译) d_santa 这样做 void d_santa(){ //do
我是一名优秀的程序员,十分优秀!