2013-02-20 91 views
1

我正在編寫一個應用程序,其中服務器必須跟蹤來自多個客戶端的連接。每個客戶端都分配了一個連接ID,它將在每個數據包中發送以進行標識。我想將連接ID​​映射到客戶端信息。早些時候,我使用std :: map,但我發現它不是線程安全的。我需要一個可以在純C++ 03中支持此功能的容器。沒有第三方庫允許(使用實驗室設備)。如果沒有這個,請告訴我如何使用std :: map和某種鎖定來實現這一點。我們調用數據結構info.There有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]; 
     } 
} 
+0

如果您使用的是C++ 11,請考慮檢查http://en.cppreference.com/w/cpp/thread – 2013-02-20 18:51:32

+0

不可以。也許我應該添加,古老的實驗室電腦:) – 2013-02-20 20:12:54

回答

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]; 

} 
+0

這對我來說看起來不合標準?但我正在尋找這樣的答案 – 2013-02-20 20:09:21

+0

@Bug Catcher - 「標準」方法將是一個包裝類,它使用map作爲基礎,並使用互斥鎖來同步方法調用。 – 2013-02-20 20:17:31

+0

實際上,我生成一個隨機連接ID,所以同步並不是必要的,也許這個解決方案不足以作爲地圖迭代器可能由於在鍵迭代時插入而變得無效? – 2013-02-20 20:48:27

0

你必須通過互斥來保護你的容器。取決於用於啓動線程的api,它將是pthread_mutex_t或std :: mutex

相關問題