üzerinde Ne olur? posix pipe as a work queuePOSIX boru: Burada desribed gibi bir iç ileti Sırasından olarak bir boru kullanmak istediğiniz bloke yazma + sinyal
glibc'nin belgelerine göre boruya yazma eğer atomik olduğunu veriler PIPE_BUF'den daha küçüktür. https://www.gnu.org/software/libc/manual/html_node/Pipe-Atomicity.html#Pipe-Atomicity
Ancak: Bir sinyal meydana geldiğinde yazma işlemi kesintiye uğrayabilir. Varsayalım, write
, boru neredeyse dolu olduğu için engellenir. Şimdi bir sinyal var. Bu veri boruya atomik olarak yazılacak mı?
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);
}
Teşekkürler! Bir writev() 'in bu bağlamda yazdığı gibi üç maddeyi de boruya yazıp yazmadığını sorabilir miyim? Aksi takdirde, bir muteks'e ihtiyacım olurdu ve atomik özellik benim için işe yaramıyordu. –
İkinci soruma cevap vermek için: evet işe yarıyor. http://man7.org/linux/man-pages/man2/writev.2.html "readv() ve writev() tarafından gerçekleştirilen veri aktarımları atomiktir" –