socket多线程安全性 引用计数


/* 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的使用对多线程问题应该有个不错的解决方案

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值