【问题标题】:how to synchronize a varied number of threads?如何同步不同数量的线程?
【发布时间】:2009-12-07 03:58:01
【问题描述】:

有人可以帮我同步不同数量的线程吗?问题是当线程数可以从 1 变化到 9 时,例如当两个客户端连接到服务器时,通信应该以这种形式同步:client1、client2、client1、client2 ......直到通信结束。 我尝试使用 pthread_join、pthread_mutex_lock 和 pthread_mutex_lock,但这会阻塞 client1,直到完成通信以启动 client2。

任何帮助将不胜感激并感谢您的回复

【问题讨论】:

  • 如果您想轮流通过哪个客户端进行通信,而不是同时处理与多个客户端的通信,则无需使用多个线程。
  • 为什么不用多线程?多线程比使用 fork 或类似的更好,因为它与大多数操作系统兼容。
  • 你能解释一下为什么你的线程需要按特定顺序进入锁定区域吗?
  • 感谢您的回复。我正在尝试运行一个可以同时涉及两个或多个软件的模拟。在这种情况下,应该在连接的客户端的每个时间步重新连接服务器。这就是我寻求帮助的原因......

标签: c++ c multithreading pthreads


【解决方案1】:

我实际上不太了解线程应该如何同步。如果有一些代码块需要以序列化的方式完成,那么 pthread_mutex_lock 应该足够好。如果应该保留操作顺序(1,2,3,1,2,3),我建议使用 pthread_mutex_lock 以及一些指示现在允许哪个线程进入临界区的变量。

// id_to_go iterates from 0 up to number_of_thread - 1
// each thread has my_id from the same range
while(1)
{
  pthread_mutex_lock(mutex);
  if (id_to_go == my_id)
  {
    // set to next thread id 
    id_to_go = (id_to_go + 1) % number_of_threads;
  }
  else
  {
    // it's not our turn, try again
    pthread_mutex_unlock(mutex);
    continue;
  }

  handle_the_client;
  pthread_mutex_unlock(mutex);
}

【讨论】:

  • 感谢您的回复。对不起,我的意思是不同数量的线程(不像以前那样不变)
  • 线程顺序对你来说重要吗?在这种情况下,您可以将 id_to_go 替换为线程标识符的循环列表,该列表在创建新线程时插入,并在加入线程时删除。在这种情况下,我可能会为线程执行块(mutex_worker)和线程列表转换的序列化使用单独的互斥锁(以便可以在其他线程为客户端服务时添加新线程)
【解决方案2】:

解决方法是在你发送一条消息后释放锁,然后在你想发送另一个消息时再次使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多