C++ 死锁和\或在线程死之前返回

C++ 死锁和\或在线程死之前返回,c++,pthreads,C++,Pthreads,我在同样的情况下被困了大约两天,我真的非常感谢任何帮助。 主线程正在调用initDevice()函数,该函数打开文件并创建一个新线程,他将使用writeToDeviceHandler()函数“编写”线程。 write2device()是从main()调用的,应该在映射中插入(将来)要写入的新任务。问题是,有时应用程序陷入某种有限循环或死锁,有时它写入您的代码是不正确的,因为它没有围绕pthread\u cond\u wait调用的循环。pthread\u cond\u wait调用可能会在虚假唤

我在同样的情况下被困了大约两天,我真的非常感谢任何帮助。 主线程正在调用
initDevice()
函数,该函数打开文件并创建一个新线程,他将使用
writeToDeviceHandler()
函数“编写”线程。
write2device()
是从main()调用的,应该在
映射中插入(将来)要写入的新任务。问题是,有时应用程序陷入某种有限循环或死锁,有时它写入您的代码是不正确的,因为它没有围绕
pthread\u cond\u wait
调用的循环。
pthread\u cond\u wait
调用可能会在虚假唤醒时返回。您必须在它返回后检查您的唤醒状态。在您的情况下,它看起来应该是这样的:

while (task.empty ())
  pthread_cond_wait(&tasks_cv, &tasks_mutex);

您的代码也缺少错误检查。请检查所有函数的所有返回值是否存在错误。

您的
WriteDeviceHandler
代码在保持互斥锁的同时完成了所有工作,完全没有线程。如果另一个线程想让这个线程完成工作,它必须获取
任务\u互斥体
。为此,它必须完成,直到该线程完成写入并释放互斥锁。那么,为什么还要用这个线程呢


当您有一个互斥锁来保护需要完成的工作时,整个要点就是在释放互斥锁的情况下实际完成工作。这样,其他线程就不必在您完成工作时等待。

使用调试器附加到卡住的进程,以找出它卡住的地方和原因。我有点担心coutI会建议您更新编码样式以包含RAII。即使与您的问题没有直接关系,所有这些手动
delete
unlock
终有一天会从背后咬您一口。在我看来,你真正想要的不是下一个要写的任务的
映射,而是一个队列。@MatthieuM.-这是另一回事。此外,是否需要在队列锁内执行“output_file.write”?如果在队列被锁定时执行冗长的操作,我看不出队列的意义。除了别的什么,这只是要求争论。谢谢。关于此任务的编码风格和其他DAST,这是一个代码的草稿,DAST对于任务的其他部分至关重要。再次感谢!
while (task.empty ())
  pthread_cond_wait(&tasks_cv, &tasks_mutex);