用于保存客户信息的线程安全数据结构

时间:2013-02-20 18:39:35

标签: c++ linux sockets map pthreads

我正在编写一个应用程序,其中服务器必须跟踪来自多个客户端的连接。为每个客户端分配一个连接ID,它在每个数据包中发送以进行识别。我想将连接ID​​映射到客户端信息。早些时候,我使用std :: map,但我发现它不是线程安全的。我需要一个可以在普通C ++ 03中支持此功能的容器。不允许使用第三方库(使用实验室设备)。如果做不到这一点,请告诉我如何使用std :: map和某种锁定来实现这一点

让我们调用数据结构信息。有2个线程在运行,(分别用于发送和接收)。他们对信息执行以下操作: -

recv_thread {
  //read id
  if(id == 0) info.insert(0,clientdata);
  else {
       do stff, update info[id]
}

send_thread { 
     for each key in info:
       if (key==0) {
          delete info[0];
          info.insert(connid, clientdata);
       }
       else {
           update info[key]
           if(client taking too long) delete info[key];
       }
 }

3 个答案:

答案 0 :(得分:1)

参见示例: -

http://en.cppreference.com/w/cpp/thread/mutex

使用互斥锁

创建std :: map

答案 1 :(得分:1)

使用__sync_fetch_and_add获取下一个connid并使用pthread互斥锁来包装其他地图调用。

pthread_mutex_t mutex;
int nextConnid = 1;
...
pthread_mutex_init(&mutex, NULL);
...
recv_thread {
  //read id
  if(id == 0) 
    info.insert(__sync_fetch_and_add(&nextConnid, 1), clientdata);
  else {
       do stff, 
       pthread_mutex_lock(&mutex);
       update info[id]
       pthread_mutex_unlock(&mutex);
}

send_thread { 
     for each key in info:
           pthread_mutex_lock(&mutex);
           update info[key]
           pthread_mutex_unlock(&mutex);
           if(client taking too long) delete info[key];

 }

答案 2 :(得分:0)

您必须通过互斥锁保护您的容器。取决于您用于启动线程的api,它将是pthread_mutex_t或std :: mutex