我正在寫一個服務器,允許在同一時間從多個客戶端連接。我爲每個新連接創建一個新線程。客戶端通過此線程與服務器進行通信。當客戶端與服務器斷開連接時,我需要將該線程的內存重新分配到服務器進程中。C++線程在其末尾刪除
問題是當我嘗試「刪除線程本身」。
我寫了一些代碼來解釋我的問題。 C類代表一個新的連接。我爲每個連接動態地創建這個類的新對象。該功能行爲被自願地簡化以解釋問題。
#include <thread>
#include <iostream>
#include <mutex>
#include <chrono>
using namespace std;
mutex m;
class C {
thread *t;
static void action(int n, C* obj) {
for (int i = 0; i < 10; i++) {
m.lock();
cout << "i:" << i << ", n:" << n << endl;
m.unlock();
}
delete(obj);
}
public:
C() : t(nullptr) {}
~C() {
delete(t); // Work if I comment this line
}
void launch() {
static int i = 0;
t = new thread(action, i++, this);
}
};
int main() {
C *c1 = new C();
c1->launch();
this_thread::sleep_for(chrono::seconds(5));
return 0;
}
對不起,我正在學習它。
爲什麼你甚至使用指針?您可以使用不需要清理的自動對象執行此操作。 – NathanOliver
@LightnessRacesinOrbit這是* C++而不是C#,嘆氣。橄欖球:在演示的代碼中不需要「新」或指針。避免使用名稱空間標準符號,標準符號中包含太多符號。 – Yakk
考慮使用線程_pool_,而不是爲每個新連接創建一個新線程。我不知道C++是否有足夠的線程池實現可以使用,但這是一個簡單的想法:您有一個阻塞隊列_tasks_(在這種情況下,每個任務都是一個代表客戶端的對象,它正在等待),並且你有一些線程永遠循環嘗試從隊列中取出任務。當一個線程得到一個任務時,它執行任務(即,它服務於客戶端),然後不再死亡,而是回到等待下一個任務。 –