2015-09-06 49 views
1

我在解決這個問題時遇到了問題。通過C套接字進行線程同步

我有兩個線程,一個執行,因爲它如下(T1a期,T1b期,T1c期) 第二(T2A,T2B,T2C)

假設T1a期T2A之前應該開始,並且T1和T2是兩個遙遠需要機器和網絡通信(TCP套接字)。

如何可以建立這兩個線程(比方說每一個的函數T1()和T2()),和一個連續的執行是平凡的,T1a期< T2A < T1b的< T2B < T1c期< T2C

+0

我很確定運行在遠程機器上的進程在任何合理的分類中都不算作多線程。 – EOF

回答

0
之間的同步

這是一個詭計問題嗎?看起來像是你在70年代以來在gazillion守護進程中發現的基本命令循環的一個特例。

您只需讓每個子任務通過UDP套接字或任何其他通信方式向遠程計算機發送消息,讓下一個任務開始。

每個 「功能」(TXY)將有一個像

wait for a message signalling previous task completion 
do my job 
send another message to signal task completion 

你實際上並不需要寫3個功能的結構。單一功能分析的消息,並採取適當的行動,會更容易維護,更可靠:

forever 
    wait for a command 
    execute the corresponding action 
    possibly send a new message to trigger an action on peer side 

你最好添加一個超時消息接收,以防止系統被卡住,如果計算機崩潰的一個或連接關閉。 跟蹤下一個預期命令以確保按照預定順序執行操作也是明智的:如果其中一個同步消息丟失會發生什麼情況?

但是,我沒有看到在同步彼此沒有依賴關係的任務中的重點。

通常你只需要這樣做,當一個給定的任務需要從前一個輸入。例如,從互聯網上獲取一些數據並將其傳遞給其他計算機進行處理。

換句話說,這些消息通常會包含執行下一部分處理所需的一些數據。

+0

這是一個我正在嘗試解決的大學練習題,它提到了兩個任務T1和T2應該同步,可以同時執行,但是同時開始(T2a)> =結束(T1a)和開始(T1c) > =結束(T2b)。我仍然不明白這怎麼能通過套接字同步,我應該爲此使用互斥/信號量嗎?或通過簡單的信號發送信號可以完成這項工作 – f0unix

+0

好的。其中一臺計算機將擔任主設備的角色並向另一臺設備發送命令:發送啓動消息,執行T1a操作,等待T1b發出完成信號,準備處理下一個段。在奴隸一方:等待主令,做你的T2a事情,表明工作結束。沖洗並重復。忽略消息傳輸時間,T1a和T2a將同時執行。下一步將在兩者都完成後立即開始。等等。 –