线程的基本概念(二)

上一篇讲了如何组织线程 线程的基本概念(一)

线程控制

线程的创建

#include<pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);

参数:

  • 第一个参数为线程id(POXI线程库中使用的)
  • 第二个参数为模式,一般为NULL
  • 线程入口函数,返回值和参数都为 void *
  • 线程入口函数的参数

线程退出
只是线程退出,并不终止整个进程
- 从线程入口函数return(主线程退出,即进程退出)(建议采用这种方式进行线程退出)
- 线程调用pthread_exit()函数终止自己
- 线程可以调用pthread_cancel()终止同一个线程组中任意线程(理解为强行退出,不建议采用)

线程等待

线程等待相较与进程等待,都是为了回收资源,但这里有两点不同

1.线程等待
.同一线程组中的线程可以相互等待
.只能是阻塞式等待
2. 进程等待
.只能父进程等子进程
.waitpid()函数可以进行非阻塞式等待
3. 存在僵尸进程,并没有僵尸线程的概念

int pthread_join(pthread_t thread, void **retval);
  1. 第一个参数.线程pid
  2. 第二个参数.线程入口函数的返回值

分离线程

int pthread_detach(pthread_t thread);

默认情况下,新创建的线程是joinable 线程退出后,需要进行线程等待(pthread_join())
来回收资源,否则会造成资源无法释放,造成内容泄露。而一般情况下,我们采用pthread_join()进行线程等待也是为了控制线程结束顺序
当我们不再关心线程结束顺序时,就可以分离线程 pthread_detach(),告诉操作系统当线程结束时自动回收线程资源。
也先也可以自己分离自己

pthread_detach(pthread_self());

一个简单的例子:
编译时加上 -lpthread 选项

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
//线程的入口函数
void * Entry(void * arg)
{
    (void) arg;

    while(1)
    {
       printf("new thread\n");
       sleep(1);
    }
}

void test()
{
    pthread_t thread_1;
    //创建一个线程
    pthread_create(&thread_1,NULL,Entry,NULL);
    int count=5;
    while(1)
    {
        printf("main thread\n");
        sleep(1);
        if(count--==0)
        {//线程退出
            pthread_cancel(thread_1);
        }
    }
    //等待线程,回收资源
    pthread_join(thread_1,NULL);
}

猜你喜欢

转载自blog.csdn.net/Misszhoudandan/article/details/80720576