Linux学习笔记-线程的自然终止
线程的自然终止线程主函数退出时,该线程自然终止。例如,下面的线程运行10秒后终止 。。。void* Thread_Main(void* context){for(int i=0; i<10; i++){printf("i am a thread ...\n");sleep(1);}return NULL;...
线程的自然终止
线程主函数退出时,该线程自然终止。例如,下面的线程运行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,设法令其自然终止。
int quit_flag = 0; // 把quit_flag设为1,则线程自然终止
void* Thread_Main(void* context)
{
while(!quit_flag)
{
printf("i am a thread ...\n");
sleep(1);
}
return NULL; // 线程主函数退出,线程终止
}
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之后,线程函数直接中断了。
void* Thread_Main(void* context)
{
pthread_setcancelstate ( PTHREAD_CANCEL_ENABLE, NULL );
for(int i=0; i<10; i++)
{
printf("i am a thread ...\n");
sleep(1);
}
return NULL; // 线程主函数退出,线程终止
}
//当线程处于sleep状态时,会自动结束sleep,立即退出
取消点: 默认是立即取消但是可以设置为延迟取消,当线程运行到下一
个取消点时才取消。
pthread_setcancelstate ( PTHREAD_CANCEL_ENABLE, NULL ) ;
pthread_setcanceltype ( PTHREAD_CANCEL_DEFERRED,NULL) ;
设置取消点
pthread_testcancel();
如下例子:
Makefile源码如下:
EXE=helloworld
SUBDIR=src
CXXFLAGS +=
LDFLAGS += -lpthread
CXX_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: %.cpp
g++ -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;
}
程序运行截图如下:
更多推荐
所有评论(0)