Linux学习笔记-线程的自然终止
線程的自然終止
線程主函數退出時,該線程自然終止。例如,下面的線程運行10秒后終止 。。。
void*?Thread_Main(void*?context) {for(int?i=0;?i<10;?i++){printf("i?am?a?thread?...\n");sleep(1);}return?NULL;??//?線程主函數退出,線程終止 }
線程的自然終止如果線程里有一個while循環,則應該設置flag,設法令其自然終止。
?
pthread_join
pthread_join的兩個作用:
① 等待B線程自然退出
② 在B線程退出后,回收B線程的系統資源
(每個線程都是一個系統級的資源,一個進程內的線程的數量是受限制的。)pthread_join(handle,?NULL);其中,handle是線程對象的句柄
?
線程只能“自然終止(return)”,不能也不應該強制殺死(kill)。(pthread_cancel不推薦使用)類似操作系統,我們應該讓操作系統自然關機,而不應該強制斷電關閉。線程的個數是受限制的,因此必須用pthread_join回收。否則,當創建了若干個線程之后,pthread_create就無法創建更多的線程。
?
?
pthread_cancel取消線程pthread_cancel:?用于取消(中止)一個正在運行的線程。然而,并不推薦用pthread_cancel,這相當于把一臺正在運行的電腦強制斷電。pthread_cancel(handle);被cancel之后,線程函數直接中斷了。
?
取消點:?默認是立即取消但是可以設置為延遲取消,當線程運行到下一
個取消點時才取消。
pthread_setcancelstate ( PTHREAD_CANCEL_ENABLE,?NULL ) ;?
pthread_setcanceltype ( PTHREAD_CANCEL_DEFERRED,NULL)?;
設置取消點
pthread_testcancel();
?
如下例子:
Makefile源碼如下:
EXE=helloworld SUBDIR=srcCXXFLAGS += LDFLAGS += -lpthreadCXX_SOURCES =$(foreach dir,$(SUBDIR), $(wildcard $(dir)/*.cpp)) CXX_OBJECTS=$(patsubst %.cpp, %.o, $(CXX_SOURCES)) DEP_FILES =$(patsubst %.o, %.d, $(CXX_OBJECTS))$(EXE): $(CXX_OBJECTS)g++ $(CXX_OBJECTS) -o $(EXE) $(LDFLAGS)%.o: %.cppg++ -c $(CXXFLAGS) -MMD $< -o $@-include $(DEP_FILES)clean: rm -rf $(CXX_OBJECTS) $(DEP_FILES) $(EXE)test:echo $(CXX_OBJECTS)?
main.cpp源碼如下:
#include <stdio.h> #include <unistd.h> #include <pthread.h>int quit_flag = 0;void *Thread_Main(void *context){for(int i = 0; i < 10 && !quit_flag; i++){printf("in thread main: %d ... \n", i);sleep(1);}printf("thread exit. \n");return NULL; }int main(){pthread_t handle;if(pthread_create(&handle, NULL, Thread_Main, NULL) < 0){printf("failed to create thread!\n");return -1;}//quit_flag = 1;pthread_join(handle, NULL);return 0; }程序運行截圖如下:
總結
以上是生活随笔為你收集整理的Linux学习笔记-线程的自然终止的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt工作笔记-信号与槽参数匹配问题
- 下一篇: Qt|C++工作笔记-QVector与V