[英]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語句運行這種代碼時,它可以運行幾個小時,然后拋出“無法創建線程”和應用程序終止的消息。 有沒有人知道我在哪里犯錯誤。 此外,如果有一種方法來運行ThreadTest
在main
使用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.