【发布时间】:2013-03-20 18:02:52
【问题描述】:
假设您有一个列表:
class CLIENTS
{
public:
CLIENTS();
~CLIENTS();
bool addClient();
bool removeClient();
bool getDataFromClientObj(unsigned int id);
bool storeDataInClientObj(unsigned int id);
private:
// vector, that contains all the clients
boost::ptr_vector<CLIENTOBJ> clients;
// mutex for the client-list
boost::mutex mutex;
};
进一步考虑,getDataFromClientObj() 获取共享锁(互斥锁,私有锁)。 除此之外,您还希望能够通过 getDataFromClient() 从客户端获取数据。
如果客户端的队列中根本没有数据,getDataFromClient() 将等待该客户端的条件变量,直到它有新数据要读取。
好吧,这是我的问题:
只要getDataFromClient();等待,(因为这是一个多读取器/单写入器列表),我无法添加新客户端或删除客户端,因为 getDataFromClient() 持有互斥锁。
如果您有一个列表,您将如何准确解决该场景,该列表应是线程安全的 + 等待特定客户端的条件变量 + 在等待客户端时,能够删除或添加其中包含的任何客户端名单?
所以这里再一次是事实:
- 线程安全列表(多读/单写)
- 能够随时添加/删除客户端
- 能够专门等待每个客户端的(特定)条件(一个客户端可能在自己的队列中存储了新数据,而另一个没有;然后 getDataFromClient() 将等待直到有新数据被读取)
我认为的问题是,鉴于每个客户端都有一个条件(伪代码:if(clientsqueue.isEmpty() -> 等待)必须有多个条件变量(我错了吗?)
更多信息:
操作系统:Windows 7
语言:C++
编译器VS2010
【问题讨论】:
-
语言:C++?我永远不会猜到。
-
@EtiennedeMartel:那我可以建议你走错了职业道路吗?
标签: c++ multithreading list shared condition-variable