Linux学习笔记-线程的自然终止

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq78442761/article/details/84578248

线程的自然终止

线程主函数退出时,该线程自然终止。例如,下面的线程运行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;
}

程序运行截图如下:

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/84578248