ithewei / libhv

🔥 比libevent/libuv/asio更易用的网络库。A c/c++ network library for developing TCP/UDP/SSL/HTTP/WebSocket/MQTT client/server.

Home Page:https://github.com/ithewei/libhv/wiki

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

关于 TcpServer SocketChannelPtr 线程安全 问题

nqf opened this issue · comments

commented
srv.onConnection = [](const SocketChannelPtr& channel) {
    std::string peeraddr = channel->peeraddr();
    std::thread([=] {
        // 这是线程安全的吗?
        if (channel->isConnected()) {
            printf("%s connected! connfd=%d id=%d tid=%ld\n", peeraddr.c_str(), channel->fd(), channel->id(), currentThreadEventLoop->tid());
        }
        else {
            printf("%s disconnected! connfd=%d id=%d tid=%ld\n", peeraddr.c_str(), channel->fd(), channel->id(), currentThreadEventLoop->tid());
        }
    }).detach();
};
srv.onMessage = [](const SocketChannelPtr& channel, Buffer* buf) {
    // echo
    printf("< %.*s\n", (int)buf->size(), (char*)buf->data());
    std::thread([=] {
        // 这是线程安全的吗?
        channel->write("ddddd");
    }).detach();
};
srv.setThreadNum(4);

SocketChannel的isConnected、write、close这些都是线程安全的,这可以让网络IO事件循环线程里接收数据、拆包组包、反序列化后放入队列,消费者线程从队列里取出数据、处理后发送响应和关闭连接,变得更加简单。

commented

SocketChannel的isConnected、write、close这些都是线程安全的,这可以让网络IO事件循环线程里接收数据、拆包组包、反序列化后放入队列,消费者线程从队列里取出数据、处理后发送响应和关闭连接,变得更加简单。

但是我看isConnected 实现是这样的,status 并不是 atomic 类型的,这样安全吗?

    bool isConnected() {
        return status == CONNECTED && isOpened();
    }

SocketChannel的isConnected、write、close这些都是线程安全的,这可以让网络IO事件循环线程里接收数据、拆包组包、反序列化后放入队列,消费者线程从队列里取出数据、处理后发送响应和关闭连接,变得更加简单。

但是我看isConnected 实现是这样的,status 并不是 atomic 类型的,这样安全吗?

    bool isConnected() {
        return status == CONNECTED && isOpened();
    }

只是读取值不要紧

commented

SocketChannel的isConnected、write、close这些都是线程安全的,这可以让网络IO事件循环线程里接收数据、拆包组包、反序列化后放入队列,消费者线程从队列里取出数据、处理后发送响应和关闭连接,变得更加简单。

但是我看isConnected 实现是这样的,status 并不是 atomic 类型的,这样安全吗?

    bool isConnected() {
        return status == CONNECTED && isOpened();
    }

只是读取值不要紧

但是这个值有可能会在 loop 线程被改变,可能会读到脏数据,正常操作应该是在loop 线程中调用它, 但是 似乎我不能 在 onMessage 中获得loop 线程的指针, 现在似乎做不到

SocketChannel的isConnected、write、close这些都是线程安全的,这可以让网络IO事件循环线程里接收数据、拆包组包、反序列化后放入队列,消费者线程从队列里取出数据、处理后发送响应和关闭连接,变得更加简单。

但是我看isConnected 实现是这样的,status 并不是 atomic 类型的,这样安全吗?

    bool isConnected() {
        return status == CONNECTED && isOpened();
    }

只是读取值不要紧

在C++中,"半写入值"通常指的是在多线程环境下,一个线程正在写入一个变量的值,而另一个线程正在读取该变量的值,可能会导致读取到部分被修改的数据,从而产生不确定的行为。这种情况可能会导致数据损坏或不一致性。

commented

在C++中,"半写入值"通常指的是在多线程环境下,一个线程正在写入一个变量的值,而另一个线程正在读取该变量的值,可能会导致读取到部分被修改的数据,从而产生不确定的行为。这种情况可能会导致数据损坏或不一致性。

是的, 所以我认为应该在 loop 线程中调用这个函数, 但是现在似乎 拿不到 loop 线程的指针