に何が起こる私はここにdesribedのような内部メッセージキューとしてパイプを使用したい:posix pipe as a work queuePOSIXパイプ:ブロックされた書き込み+信号
はglibcの文書によると、パイプへの書き込みがアトミックですかデータはPIPE_BUFより小さい。 https://www.gnu.org/software/libc/manual/html_node/Pipe-Atomicity.html#Pipe-Atomicity
しかし、信号が発生すると書き込みが中断することがあります。パイプがほぼ満杯であるため、write
がブロックされていると仮定します。今すぐシグナルが発生します。そのデータはパイプにアトミックに書き込まれますか?
template <typename T>
ssize_t put(const T& data)
{
static_assert(sizeof(T) < PIPE_BUF, "We use the atomic property of the pipe write. So sizeof(T) MUST be smaller than PIPE_BUF");
int written;
const size_t id = T::value;
written = write(m_fds[write_fd], &id, sizeof(size_t));
assert(written == sizeof(size_t));
const size_t sT = sizeof(T);
write(m_fds[write_fd], &sT, sizeof(size_t));
assert(written == sizeof(size_t));
write(m_fds[write_fd], &data, sizeof(T)); // * this blocks in example
assert(written == sizeof(T));
return sizeof(T);
}
ありがとうございました! writev()が3つの項目すべてをパイプに書き込むためにこの文脈での書き込みと同じ振る舞いをするかどうか聞いてもよろしいですか?さもなければ、私はミューテックスが必要になり、アトミックなプロパティは私にとって役に立たないでしょう。 –
私の2番目の質問に答える:はいそれは動作します。 http://man7.org/linux/man-pages/man2/writev.2.html "readv()とwritev()によって実行されるデータ転送は、 –