当其他线程可能仍然使用它时,线程安全对象是否应该阻止它被删除?

时间:2014-04-05 23:53:01

标签: c++ multithreading

我将首先给出一个代码示例。

#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;
}

SocketAcceptor是线程安全的。但是,Socket的线程安全保证是否也会阻止编写上述错误代码?

解决方案是允许将线程安全类创建为std::shared_ptr

我认为归结为应该防止存储对线程安全对象的引用,并且使用std::shared_ptr这似乎是合适的。当然,图书馆用户可以直接取消引用std::shared_ptr并存储对此的引用(对此没有预防,对吗?),但这种行为可能被归类为“故意询问”麻烦&#39;而不是编程错误。

0 个答案:

没有答案