/* int m_ref_cnt; */
/* int m_sock; */
/* send(m_sock); */
/* recv(m_sock); */
/* connect(m_sock); */
/* close(m_sock); */
class Client
{
int m_sock;
void send_msg(guint8* buffer)
{
}
bool recv_msg(guint8* buffer)
{
}
void connect()
{
m_sock = socket();
::connect(m_sock, ip, port);
}
void run()
{
connect();
while(true)
{
if(!recv_msg(buffer))
connect();
else
g_async_queue_push(m_recv_queue, buffer);
}
}
public:
GAsyncQueue m_event_queue;
GAsyncQueue m_recv_queue;
};
1. 首先考虑共享数据(在这里是m_sock)在各个函数中多线程下执行会不会产生破坏性, 对socket而言,没有破坏性, 对m_sock的connect,close,send,recv均不会破坏性
2. 如果想考虑同步性:完全对发送和接收(在不同的线程中执行)采用mutex保护的代价太大
3. 可以采用同步操作来解决,比如异步io等等
4. 需要注意的是: 引用计数的方式并不能解决object的生命周期的多线程问题
5. 一种解决方案: object的生命周期(创建和销毁,create,destroy)控制在一个线程之类, 而该object提供给其他线程使用的方法需要保证对共享数据的处理不能具有破坏性。
6. 另外: 对于GAsyncQueue的使用对多线程问题应该有个不错的解决方案