我将首先给出一个代码示例。
#include <iostream>
#include <thread>
#include <cstdlib>
class Socket
{
};
class Acceptor
{
public:
void accept(Socket& socket)
{
}
};
int main()
{
std::thread thread;
{
Socket socket;
thread = std::thread([&socket]
{
Acceptor acceptor;
acceptor.accept(socket);
});
}
thread.join();
std::cin.sync();
std::cin.get();
return EXIT_SUCCESS;
}
类Socket
和Acceptor
是线程安全的。但是,Socket
的线程安全保证是否也会阻止编写上述错误代码?
解决方案是允许将线程安全类创建为std::shared_ptr
。
我认为归结为应该防止存储对线程安全对象的引用,并且使用std::shared_ptr
这似乎是合适的。当然,图书馆用户可以直接取消引用std::shared_ptr
并存储对此的引用(对此没有预防,对吗?),但这种行为可能被归类为“故意询问”麻烦&#39;而不是编程错误。