(1) 原始代码
最近使用单生产者-多消费者模型是遇到一个问题,以前既然都没有想到过。生产者线程的代码如下,基本功能就是接收到一个连接之后创建一个Socket对象并放到list中等待处理。
void DataManager::InternalStart() {
server_socket_ = new ServerSocket();
if (!server_socket_->SetAddress(NetworkUtil::GetIpAddress().c_str(), 9091)) {
LOG(ERROR) << "Set address failed.";
delete server_socket_;
server_socket_ = NULL;
return;
}
server_socket_->SetSoBlocking(true);
if (!server_socket_->Listen()) {
LOG(ERROR) << "listen failed.";
return;
}
Socket *socket = NULL;
while (!stop_) {
if ((socket = server_socket_->Accept()) != NULL) {
LOG(INFO) << "Recieved connection fd: " << socket->GetAddr();
{
common::MutexLock lc(&socket_mu_);
socket_list_.push_back(socket);
cond_var_.Signal();
}
}
}
多个消费者线程的的代码如下,基本功能是从list中取得一个Socket对象进行处理;
void DataManager::WorkEntry() {
Socket *socket = NULL;
while (!stop_) {
// Get connection socket.
{
common::MutexLock lc(&socket_mu_);
if (socket_list_.empty()) {