关于 TcpServer SocketChannelPtr 线程安全 问题
nqf opened this issue · comments
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事件循环线程里接收数据、拆包组包、反序列化后放入队列,消费者线程从队列里取出数据、处理后发送响应和关闭连接,变得更加简单。
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(); }
只是读取值不要紧
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++中,"半写入值"通常指的是在多线程环境下,一个线程正在写入一个变量的值,而另一个线程正在读取该变量的值,可能会导致读取到部分被修改的数据,从而产生不确定的行为。这种情况可能会导致数据损坏或不一致性。
在C++中,"半写入值"通常指的是在多线程环境下,一个线程正在写入一个变量的值,而另一个线程正在读取该变量的值,可能会导致读取到部分被修改的数据,从而产生不确定的行为。这种情况可能会导致数据损坏或不一致性。
是的, 所以我认为应该在 loop 线程中调用这个函数, 但是现在似乎 拿不到 loop 线程的指针