为什么调用write(3)会终止线程?

时间:2017-01-20 15:45:38

标签: c++ multithreading macos pthreads

我有一个保存到文件的线程。这可能超过99.9%的时间。但有时候,线程每次都在同一个地方意外终止,调用write()(BSD系统调用)。对write()的实际调用非常简单:

ssize_t wr = ::write(m_fd, buffer, (size_t)bytes);

在退出时,缓冲区为4个字节的零,字节为4,文件描述符与此线程中的所有先前写入相同。我使用从pthread_exit()调用的pthread_cleanup_push()安装了一个清理函数,这样当出现意外退出时我可以在调试器中查找。

问题是,write()为什么要这样做而不是返回错误?我可以阻止它退出并处理错误而不会导致线程终止吗?这个过程看起来似乎没有受到影响,并且在这个意外退出发生后,还有十几个其他线程似乎继续正常运行。这是OS X 10.11.6。

我注意到tramp_cerror()的来电似乎没有在任何地方记录,事实上如果你谷歌它什么都没有出现。我是世界上第一个想知道它是什么以及为什么它似乎有权终止我的线程的人吗?

这是堆栈:

#0  0x01c1e388 in cleanup(void*) at ThreadAny.cpp:32
#1  0x0728900b in _pthread_exit ()
#2  0x07289adc in pthread_exit ()
#3  0x07286bc2 in _pthread_exit_if_canceled ()
#4  0x9189ed9d in cerror ()
#5  0x918a7415 in tramp_cerror ()
#6  0x13fda508 in 0x13fda508 ()
#7  0x024f6388 in long long Standard::File::write<unsigned int>(unsigned int const*, long long) at FileIO.h:54
#8  0x024e5fab in SaveFile(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, bool, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >*) at SaveFile.cpp:4947
#9  0x01c1eeaa in SaveFileThread(void*) at ThreadAny.cpp:103
#10 0x01afe81d in PThread::execute() at PThread.cpp:129
#11 0x01ac7c95 in PThread::run() at POSIXThread.cpp:91
#12 0x01ac7d8a in PThread::threadFunction(void*) at POSIXThread.cpp:131
#13 0x07287928 in _pthread_body ()
#14 0x0728789e in _pthread_start ()
#15 0x07284f2e in thread_start ()

0 个答案:

没有答案