linux创建与结束线程

打算写一些入门级别的多线程笔记,等我把多线程的函数都整理完再一点点添加(一下子全都搞上去,会有种抓不到重点的感觉)

线程创建函数pthread_create(4)

int pthread_create(pthread_t *thread,
pthread_attr_t *attr,
void *(*start_routine)(void*),
void *arg);

 

参数:
  thread: 用于标识一个线程,它是一个pthread_t类型的变量,在头文件pthreadtypes.h中定义,如下所示。
        typedef unsigned long int thread_t;
  attr: 设置线程它属性,如果为NULL,则采用默认属性。
  start_routine: 函数指针,当线程的资源分配好后,线程就会运行这个线程函数。
  arg: 线程函数的参数。
函数返回值:
  0: 线程创建成功
  非0: 线程创建失败

线程的结束函数pthread_join(2)和pthread_exit(1)

1. int pthread_join(pthread_t thread, void **retval);
描述:
  pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果进程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。
参数:
  thread: 线程标识符,即线程ID,标识唯一线程。
  retval: 用户定义的指针,用来存储被等待线程的返回值。
返回值:
  0代表成功。 失败,返回的则是错误号。

补充:  linux线程中,pthread有两种状态joinable状态和unjoinable状态。

  (1)joinable状态下,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符。只有当你调用了pthread_join之后这些资源才会被释放,这是需要main函数或者其他线程去调用pthread_join函数。

  (2)unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。设置unjoinable状态设置有两种办法 一是可以在pthread_create时指定,二是线程创建后在线程中pthread_detach自己 pthread_detach(pthread_self()),状态改为unjoinable状态,确保资源的释放。

2. void pthread_exit(void* retval)
线程通过调用pthread_exit函数终止执行,就如同进程在结束时调用exit函数一样。这个函数的作用是,终止调用它的线程并返回一个指向某个对象的指针。
其中,retval可以从pthread_join(2)的第二个参数获得。

好,来看一个例子吧:

描述:

  主线程和子线程交替打印,在主线程中等待子线程推出,主线程会阻塞在line27,在子线程退出后,主线程打印退出的信息。

  在编译的时候需要链接线程库libpthread,所以要加一个-lpthread。

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* helloThread(void *args)
{
    int i = 0;
    while(i<10)
    {
        printf("thread id:%d says hi!%d\n",getpid(),i);
        ++i;    
        usleep(1);
    }
    pthread_exit("finished!");
}
int main()
{
    pthread_t tid;
    pthread_create(&tid,NULL,helloThread,NULL);
    int i = 0;
    while(i<10)
    {
        printf("main says hi %d\n",i);
        ++i;
        usleep(1);
    }
    char *p = NULL;
    pthread_join(tid,(void**)&p);
    printf("exit args is: %s\n",p);
    printf("thread finished\n");
    
    return 0;
}

  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。