我將一個程式部署到多臺服務器上(假設服務器 IP 和提供服務的埠是192.168.1.101:10001、192.168.1.102:10001、192.168.1.103:10001、192.168.1.104:10001)。它們都是使用Linux socketapis監聽請求,可以獨立完成任務。
現在,我想同時向所有四臺服務器發送資料,以便它們可以同時執行任務。
我使用 C Socket 使用一臺 Windows 10 PC 發送資料。的基本程式send_data如下:
void send_data(string& server_ip, string& server_port, vector<char>& buf) {
struct addrinfo ...; // set the server information
SOCKET socket = socket(...); // create the socket object
connect(socket, ...); // connect the server
send(socket, buf, ...); // send the buf data
}
當將資料順序發送到四個服務器時,這是可以的,例如,
vector<char> bufdata(...);
char* server_ips = {"192.168.1.101", "192.168.1.102", "192.168.1.103", "192.168.1.104"};
char* port = "10001";
for (int i = 0; i < 4; i) {
send_data(server_ips[i], port, bufdata);
}
我期望的是主機客戶端可以同時發送資料。我嘗試了以下方法:
for (int i = 0; i < 4; i) {
std::thread t(send_data, server_ips[i], port, bufdata);
}
但是程式將毫無運氣地退出。
你能幫忙給一些建議嗎?謝謝。
uj5u.com熱心網友回復:
不確定這是唯一的問題,但鑒于您共享的內容,主執行緒不會等待作業執行緒完成其任務。
根據這個答案:當主執行緒退出時,其他執行緒也退出嗎?,當主執行緒從 回傳時,行程將終止main()。
建議修復:
int main() {
// .. your logic here
std::vector<std::thread> threads;
for (int i = 0; i < 4; i) {
std::thread t(send_data, server_ips[i], port, bufdata);
threads.push_back(std::move(t));
}
for (int i = 0; i < 4; i) {
if (threads[i].joinable())
threads[i].join(); // wait for threads[i] to finish
}
// .. clean up
}
uj5u.com熱心網友回復:
您沒有加入或分離導致程式退出并出現錯誤的執行緒。將執行緒存盤在一個陣列中,以便您可以在回圈中加入它們或呼叫 detach。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/349085.html
