vecotr<socket> client_list;  // 存放连接的客户端// 主线程
sock = accept();  // 阻塞, 返回连入的socket;
enter_criticalsection(); // 进入临界区
client_list.push_back(skck);
leave_criticalsection(); // 离开临界区// 发送线程
enter_criticalsection(); // 进入临界区
for ( 遍历client_list )
    逐个发送消息..
leave_criticalsection(); // 离开临界区
为了线程对client_list的同步..
发送线程的for循环在临界区中..
而for循环可能要执行很多遍, 而且发送消息的时间可能也比较长..
这里存在的问题就是, 发送线程的临界区里的代码执行时间太长了.
这样会导致主线程等很久..
有没有办法解决这个问题呢???我对多线程不太会..
希望大神能传授一些技巧..
在此谢过..多线程c++同步编程技巧

解决方案 »

  1.   

    enter_criticalsection(); // 进入临界区
    client_list.push_back(skck);
    leave_criticalsection(); // 离开临界区你这个cilent——list是共享区域么?
    加入临界区干嘛?
      

  2.   

    主线程里等待的时候不要一直死等
    可以增加消息循环等
    while(1) {
        ::PeekMessage();
        ::DispatchMessage()
    }
      

  3.   

    一种思路是先加锁把client_list拷贝到另一个list或数组里
    然后就可以不用加锁的遍历另一个list或数组
      

  4.   

    首先客户端数肯定要有上限的,譬如100000
    我以前的做法是先开辟一定个数的数组(譬如100000)
    遍历(群发、广播)基本上是lockfree的,只是插入和删除(客户端连接和断开)多耗时间
    看实际衡量
      

  5.   

    enter_criticalsection(); // 进入临界区
    for ( 遍历client_list )
        逐个发送消息..
    leave_criticalsection(); // 离开临界区
    你是如何发消息的,用PostMessage不用等直接返回,至多走一遍循环还有为什么要循环一圈了? 只发新增加的不行吗?从这2点去考虑优化
      

  6.   


    client_list是两个线程共享的变量.
    发送线程中需要遍历这个变量, 对所有socket发送消息.// 发送线程
    enter_criticalsection(); // 进入临界区
    for ( 遍历client_list )
        逐个发送消息..
    leave_criticalsection(); // 离开临界区