簡體   English   中英

為什么 CPU 使用率是 100%,並且增加線程數時程序凍結?

[英]why CPU usage is 100%, and program freezing when increasing number of thread?

我有一個多線程應用程序,以便我連接傳感器,(傳感器的數量取決於用戶)這些傳感器收集數據並通過 TCP 將它們發送到我的程序。 我從 TCP 獲取這些數據並進行一些復雜的計算。 之后,我將結果寫入共享內存空間(對於每個傳感器結果,我有不同的內存空間。)為此,我創建了 3 個不同的類(用於 TCP、計算、寫入共享內存)。 並且每個類任務並行運行(task1 為TCP,task2 為計算,task3 寫入)。 每個任務都必須在 while(1) 中,因為我希望每個線程都運行,直到用戶完全停止程序。 如果我有一個傳感器,我會創建一個 TCP 對象、一個計算對象和一個用於寫入共享內存的對象,並且我為一個 TCP 創建 3 個不同的線程,一個計算和一個寫入。 如果我有 2 個傳感器,每個傳感器有 2 個對象,每個傳感器有 2 個線程,依此類推。

我的問題是,由於使用 while 循環,我的 CPU 使用率始終為 100%。 如果我有 1 或 2 個傳感器,我有 3 或 6 個不同的線程,一切正常。 但是如果我有更多的傳感器,例如 5,我的程序就會開始凍結。 我如何防止凍結?

我的代碼基本上是;

void classTCP::threadTCP(){
    while(1){
        pthread_mutex_lock(&mutex1);
        pthread_cond_wait(&cond1, &mutex1);
        //..do_something
        pthread_mutex_unlock(&mutex1);
    }
}
void classCalculation::threadCalculation(){
    while(1){
        pthread_mutex_lock(&mutex2);
        pthread_cond_wait(&cond2, &mutex2);
        //..do_something
        pthread_mutex_unlock(&mutex2);
    }
}

void class3::thread3(){
    while(1){
        pthread_mutex_lock(&mutex3);
        pthread_cond_wait(&cond3, &mutex3);
        //..do_something
        pthread_mutex_unlock(&mutex3);
    }
}

int main()
{
    while(1)
    {
        pthread_cond_broadcast(&cond1);
        pthread_cond_broadcast(&cond2);
        pthread_cond_broadcast(&cond3);
        //...
    }
}

問題是您有很多線程正在忙於等待。 他們不會懶惰地等待輸入,他們會積極尋找是否有輸入。

要進行的第一個改進是消除每個傳感器的過多線程。 計算線程花時間等待 TCP 線程。 同樣,每個寫線程等待一個計算線程,那只是一種浪費。 只需有一個包含“TCP 讀取、計算、寫入”循環的傳感器線程。

接下來,使用 TCP 阻塞讀取。 在有可用數據之前,這將占用大約 0% 的 CPU 使用率。 由於每個傳感器只使用一個線程,這也意味着您使用 0% 的 CPU 進行計算和寫入。

一種更現代的方法是 Boost Asio,它在有可用數據時調用您的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM