簡體   English   中英

如何在主函數中無限運行線程而不會導致程序終止

[英]how to run thread in main function infinitely without causing program to terminate

我有一個函數說void *WorkerThread ( void *ptr)

函數*WorkerThread( void *ptr)具有無限循環,可從串行端口連續讀寫

void *WorkerThread( void *ptr)
{  
while(1)  
     {  
     // READS AND WRITE  from Serial Port USING MUXTEX_LOCK AND MUTEX_UNLOCK 


    } //while ends  

}     

我想要的另一個功能是ThreadTest示例

int ThreadTest()  
{  
    pthread_t Worker;  
    int iret1;  
    pthread_mutex_init(&stop_mutex, NULL);  
    if( iret1 = pthread_create(&Worker, NULL, WorkerThread, NULL) == 0)  
    {  
     pthread_mutex_lock(&stop_mutex);  
     stopThread = true;  
     pthread_mutex_unlock(&stop_mutex);  
    }  

 if (stopThread != false)  
     stopThread = false;  
pthread_mutex_destroy(&stop_mutex);  

return 0;    
}    

main功能
我有類似的東西

int main(int argc, char **argv)  
{  

    fd = OpenSerialPort();  
    if( ConfigurePort(fd) < 0) return 0;  

    while (true)   
    {

        ThreadTest();  
    }
return 0;  
}  

現在,當我使用debug語句運行這種代碼時,它可以運行幾個小時,然后拋出“無法創建線程”和應用程序終止的消息。 有沒有人知道我在哪里犯錯誤。 此外,如果有一種方法來運行ThreadTestmain使用while(true) ,因為我已經在使用while(1)ThreadWorker讀取和寫入無限。 歡迎所有評論和批評。 謝謝和問候,SamPrat。

您正在不斷創建線程,並且可能會遇到線程數限制。 Pthread_create手冊頁說:

EAGAIN Insufficient resources to create another thread, or a system-imposed
              limit on the number of threads was encountered.  The latter case may
              occur in two ways: the RLIMIT_NPROC soft resource limit (set via
              setrlimit(2)), which limits the number of process for a real user ID,
              was reached; or the kernel's system-wide limit on the number of
              threads, /proc/sys/kernel/threads-max, was reached.

您應該重新考慮應用程序的設計。 創建無限數量的線程不是神設計。

[UPDATE]

您正在使用lock來設置整數變量:

pthread_mutex_lock(&stop_mutex);  
     stopThread = true;  
     pthread_mutex_unlock(&stop_mutex);

但是,這不是必需的,因為設置int是原子的(可能在所有架構上?)。 在進行非原子操作時應該使用鎖,例如: test and set

take_lock ();
if (a != 1)
a = 1
release_lock ();  

每次調用ThreadTest都會創建一個新線程,並且永遠不會破壞這些線程。 所以最終你(或操作系統)用盡了線程句柄(有限的資源)。

線程消耗資源(內存和處理),並且每次主循環調用ThreadTest()時都會創建一個線程。 資源是有限的,而你的循環不是,所以這最終會引發內存分配錯誤。

你應該擺脫主循環,並讓ThreadTest返回新創建的線程( pthread_t )。 最后,使用pthread_join使main等待線程終止。

你的pthreads是僵屍並消耗系統資源。 對於Linux,您可以使用ulimit -s來檢查您的活動上限 - 但它們也不是無限的。 使用pthread_join()讓線程完成並釋放它消耗的資源。

你知道select()能夠讀取多個(設備)句柄嗎? 您還可以定義用戶定義的以停止select()或超時。 考慮到這一點,你可以啟動一個線程,如果沒有發生則讓它休眠 如果您打算停止它,您可以發送一個事件 (或超時)來打破select()函數調用。

您必須考慮的另一個設計概念是消息隊列,以在主應用程序和/或pthread之間共享信息。 select()與此技術兼容,因此您可以將一個概念用於數據源(設備和消息隊列)。

這里提供了一個很好的pthread閱讀和最好的pthread書: 使用POSIX(R)線程編程 ,ISBN-13:978-0201633924

看起來你沒有調用pthread_join() ,它在非分離線程完成后清理狀態。 我推測你在這里遇到了一些每個進程資源限制。

正如其他人已經注意到這不是很好的設計 - 為什么不重新使用線程而不是在每個循環上創建一個新線程?

暫無
暫無

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

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