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;
}

  

时间: 2024-10-26 08:47:28

linux创建与结束线程的相关文章

Delphi 如何解决在DLL的入口函数中创建或结束线程时卡死

先看一下使用Delphi开发DLL时如何使用MAIN函数, 通常情况下并不会使用到DLL的MAIN函数,因为delphi的框架已经把Main函数隐藏起来 而工程函数的 begin  end 默认就是MAIN函数的DLL_PROCESS_ATTACH事件的处理代码,如需要完整的处理其他事件, 如 DLL_PROCESS_DETACH,DLL_THREAD_ATTACH, DLL_THREAD_DETACH,可在工程文件中做如下处理: procedure DLLEntryPoint(Reason:D

Linux进程创建和结束

在Linux中,进程的创建由系统调用fork和vfork完成.它们生成一个子进程并且子进程是父进程的一个复制品. Fork系统调用对应的kernel函数是sys_fork,此函数简单的调用kernel函数do_fork.一个简化版的do_fork执行如下: (1)alloc_pid().给新的进程分配一个新的pid,即进程号 (2)copy_process()此函数会做fork的大部分事情,它主要完成讲父进程的运行环境复制到新的子进程,比如信号处理.文件描述符和进程的代码数据等. (3)wake

C++ Linux 多线程之创建、管理线程

线程就是,在同一程序同一时间内允许执行不同函数的离散处理队列. 这使得一个长时间去进行某种特殊运算的函数在执行时不阻碍其他的函数变得十分重要. 线程实际上允许同时执行两种函数,而这两个函数不必相互等待. 一旦一个应用程序启动,它仅包含一个默认线程. 此线程执行 main() 函数. 在 main()中被调用的函数则按这个线程的上下文顺序地执行. 这样的程序称为单线程程序. 反之,那些创建新的线程的程序就是多线程程序. 他们不仅可以在同一时间执行多个函数,而且这在如今多核盛行的时代显得尤为重要.

win32多线程 (一) 线程创建与结束等待

#include "stdafx.h"#include <Windows.h>#include <iostream> using namespace std; DWORD WINAPI ThreadFuncFirst(LPVOID param){ int iCount = 50; while(iCount--){  cout<<"\nThreadFuncFirst:"<<iCount; } return 0;} DWO

线程的基本操作,创建线程,结束线程,新线程跟原线程共享变量

#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <pthread.h> // 包含线程库 #include <string.h> void *thread_function(void *arg); // 定义线程函数原型 //char message[] = "THREAD_TEST"; // 定义公用的内存空间 char message[

linux内核中的线程创建接口

介绍一些内核给我们提供的用于在内核中创建线程的内核接口函数. 其实在linux内核中,无论是进程还是线程,都是用struct task_struct结构体来表示的. 用于创建一个内核线程的函数: struct task_struct * kthread_create( int (*threadfn)(void *data),                                           void *data,                                 

Linux多线程实践(1) --线程理论

线程概念 在一个程序里的一个执行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列/指令序列"; 一切进程至少有一个执行线程; 进程  VS. 线程  1.进程是资源分配(进程需要参与资源的竞争)的基本单位,而线程是处理器调度(程序执行)的最小单位; 2.线程共享进程数据,但也拥有自己的一部分(非常少O(∩_∩)O~)数据,如线程ID.程序计数器.一组寄存器.堆栈.errno(错误代码).信号状态.优先级等; 3.一个进程内部的线程可以共享资源,如代码段.数

linux系统编程:线程原语

线程原语 线程概念 线程(thread),有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.更多详细解释看百度百科:线程. 在Linux shell下通过命令 $ ps -Lf pid 查看指定pid号下的所有线程. 线程之间的共享与非共享 这里的线程是指同一进程下的线程. 共享: 1.文件描述符表   2.每种信号的处理方式   3.当前工作目录   4.用户ID和组ID   5

linux程序设计——第一个线程程序(第十二章)

第12章    POSIX线程 在第11章中,介绍了如何在linux中处理进程.但有时人们认为,用fork调用来创建新进程的代价太高.在这种情况下,如果能让一个进程同时做两件事情或者至少看起来是这样会非常有用,而且,人们页希望能有两件或更多的事情以一种非常紧密的方式同时发生,这就需要线程发挥作用了. 12.1    什么是线程 在一个程序中多个执行路线就叫做线程(thread).更准确的定义是:线程是一个进程内部的一个控制序列.虽然linux和许多其他的操作系统一样,都擅长同时运行多个进程,但迄