【问题标题】:segmentation fault on pthread_mutex_lockpthread_mutex_lock 上的分段错误
【发布时间】:2010-10-30 16:45:18
【问题描述】:

尝试执行时遇到分段错误

pthread_mutex_lock(&_mutex).

这真的很奇怪,我不确定是什么原因造成的。我已经在构造函数中初始化了 _mutex

pthread_mutex_init(&_mutex,NULL).

我能做什么?

【问题讨论】:

  • 请发布更多代码。很可能问题出在完全不同的地方,只是在您的 pthread_mutex_lock 调用中出现。
  • 无法帮助您提供您提供的信息。你只会得到有根据的猜测。
  • 我希望有一个有根据的猜测,类似于“您需要在 main() 调用全局初始化函数”。原来这只是一件愚蠢的事情。那么,段错误,你会期待什么?

标签: c++ pthreads segmentation-fault mutex


【解决方案1】:

解决了,我对此感到非常恼火。 我想将 Producer* 作为参数发送给 Pthread 运行的函数,所以我使用了 &(*iter),其中 iter 是在生产者向量上运行的迭代器。

我没有注意到它(正确地)是一个向量,这意味着我一直在发送Producer* *,它产生了未定义的结果。呸呸呸。显然,我没有注意到这一点,因为 Pthreads 是纯 C 语言,因此使用 void* 作为接受任何类型参数的唯一方式。

【讨论】:

  • 我以为我将不得不花费数小时试图弄清楚为什么我在互斥锁上遇到了段错误,但这是我发现的第一个帖子,结果我碰巧在做和你一模一样!
  • 看到同样的问题,我还是不明白,你的解决方法是什么?
  • 这里也一样——记得检查指针是否不为空,否则你会得到可能有点混乱的 SEGV。
【解决方案2】:

附加一个调试器并找出确切导致段错误的原因。有可能某个指针只是指向随机性或未初始化的区域。

同时运行 valgrind 的 memcheck 并查看内容。

编辑

针对下面的 cmets,pthread API 的使用在某处听起来不正确。我推荐了 O'Reilly 的“PThread Programming”作为参考。这就是让我前进的原因:) 我猜到了这一点,因为 API 的使用正在将 pthread_mutex_t 结构内部的指针移动到危险的地方。正确使用 API 不会发生这种情况。

【讨论】:

  • 我愿意,但是 Eclipse 选择不合作并且调试目前无法正常工作:x
  • 你将不得不这样做。它不太可能是 pthread API 中的错误......所以只留下你的代码 :S :)
  • 我想。好吧,我现在设法解决了 Eclipse 错误,所以我很高兴,因为我可以考虑我现在必须做的调试。
  • 您也可以从命令行启动 'gdb' 和 'valgrind --leak-check=full myprog'。不需要 Eclipse。
  • :) 祝您调试顺利 :) 如果您是新手,调试确实会更快
猜你喜欢
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 2017-09-17
  • 2015-01-20
相关资源
最近更新 更多