我有多个线程使用“printf”。 “Printf”不是线程安全的。 那么我可以在它周围使用互斥锁来使其线程安全吗? 还是仍然存在并发问题?
// member
std::mutex mtxTcp;
// inside a function
mtxTcp.lock();
printf("Hello %d\n", u16Id);
mtxTcp.unlock();
是的,但不要直接使用互斥锁:
{ // added scope
std::lock_guard lock{mtxTcp};
printf("Hello %d\n", u16Id);
}
printf
是线程安全的,引用 7.21.2 Streams。 ISO/IEC 9899:202x。编程语言 — C:
每个流都有一个关联的锁,用于防止多个执行线程访问流时发生数据争用,并限制多个线程执行的流操作的交错。一次只有一个线程可以持有该锁。锁是可重入的:单个线程可以在给定时间多次持有锁。
所有读取、写入、定位或查询流位置的函数都会在访问流之前锁定该流。当访问完成时,它们释放与流关联的锁。
因此您不需要添加自己的同步。