【问题标题】:C language: Parallel threads?C语言:并行线程?
【发布时间】:2011-05-05 16:29:32
【问题描述】:

基本上我有两个要并行运行的套接字,所以我不必等待一个套接字发送数据来接收另一个套接字的数据等。 我可以通过分叉轻松地做到这一点,但是,为了更整洁,我想知道是否有办法从同一个过程中做到这一点。

类似:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void test(){
         sleep(5000);
}
int main(int argc, char *argv[])
{
  printf("%d\n",time(NULL));
  test();
  printf("%d\n",time(NULL));
  system("PAUSE");
  return 0; 
}

但两行输出将是相同的,因为睡眠功能正在“其他地方”处理。

我找到了一个关于创建线程的 MSDN 文档,但它谈到 C 库函数对它不安全,这让我很担心,我喜欢我的 stdlib!

所以,是的,如果你有任何例子,你可以使用 sleep() 作为占位符,我很擅长使用套接字 :) 我在 Windows 上,但 Unix 版本也不错,或者更好的是,两者都可以使用。

编辑:感谢您的所有回复。 我想我明白你的意思:我有两个套接字,然后我调用 select(),它返回所有准备接收/发送数据的套接字,我发送/接收我的数据,然后循环回来。 但是,由于尚未创建套接字,我该如何使用 accept() 来实现呢?

【问题讨论】:

    标签: c multithreading sockets


    【解决方案1】:

    最简单的方法是使套接字非阻塞,并使用select() 和/或WaitForMultipleObjects() 检查何时可以从每个套接字读取/写入更多数据。这样,应用程序可以保持单线程,同时看起来仍然为多个套接字提供服务。

    【讨论】:

    • 没错!我宁愿尽可能远离线程。对于 I/O 密集型任务,使用异步 I/O 似乎要容易得多。
    【解决方案2】:

    您可以使用 omp 部分或使用 pthread/WinThread

    【讨论】:

      【解决方案3】:

      或者在 Unix 上,正常的解决方案是 fork()

      【讨论】:

      • 这个是不是叉太多粗粮了?
      • @Joel - 可能 select 会更好 - 但对于大型服务器来说 fork() 是正常的
      【解决方案4】:

      我不知道它在 Windows 上是否有效(或有模拟),但总是有 select

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-29
        • 2021-01-03
        • 1970-01-01
        • 2013-06-27
        • 1970-01-01
        • 2017-07-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多