2011-05-05 89 views
1

基本上我有两个我想并行运行的套接字,所以我不必等待一个套接字发送数据从另一个接收数据等。 我可以通过分叉,但是,为了更整洁,我想知道是否有办法通过同一个过程来完成。C语言:并行线程?

喜欢的东西:

#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(),因为套接字尚未创建?

回答

3

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

+0

正是!我宁愿尽量远离线程。对于使用异步I/O的I/O绑定任务似乎要容易得多。 – 2011-05-05 16:40:27

0

可以使用OMP部分或利用并行线程/ WinThread

0

或UNIX正常的解决办法是fork()

+0

这不是叉子太粗糙吗? – 2011-05-05 16:35:24

+0

@Joel - 可能选择会更好 - 但对于大型服务器fork()是正常的 – 2011-05-05 16:36:06

+0

OK :)感谢您的平视 – 2011-05-05 16:36:27

0

我不知道,如果它的工作原理(或具有模拟)在Windows上,但总是有select