2011-05-05 84 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