首页 > 系统相关 >Linux多线程02-创建线程

Linux多线程02-创建线程

时间:2023-06-26 09:02:15浏览次数:44  
标签:02 attr int create pthread 线程 arg 多线程

pthread_create

描述:

pthread_create() 函数在调用进程中创建一个新的线程。新线程通过调用 start_routine() 开始执行,arg 作为 start_routine() 的唯一参数传递。

新线程以以下方式之一终止:

  • 调用 pthread_exit(3),指定可供调用同一进程中 pthread_join(3) 的其他线程使用的退出状态值。
  • 从 start_routine() 返回。这相当于在返回语句中提供的值调用 pthread_exit(3)。
  • 被取消(参见 pthread_cancel(3))。
  • 进程中的任何线程调用 exit(3),或者主线程从 main() 返回。这将导致所有线程的终止。

attr 参数指向 pthread_attr_t 结构,该结构的内容在线程创建时用于确定新线程的属性;此结构使用 pthread_attr_init(3) 和相关函数进行初始化。如果 attr 为 NULL,则使用默认属性创建线程。

成功调用 pthread_create() 会将新线程的 ID 存储在由 thread 指向的缓冲区中;此标识符用于在后续调用其他 pthreads 函数中引用线程。

新线程继承创建线程的信号掩码的副本(pthread_sigmask(3))。新线程的挂起信号集为空(sigpending(2))。新线程不继承创建线程的备用信号栈(sigaltstack(2))。

新线程继承调用线程的浮点环境(fenv(3))。

新线程的 CPU 时间时钟的初始值为 0(参见 pthread_getcpuclockid(3))。

一般情况下, main函数所在的线程称之为主线程(main线程,其余创建的线程称之为子线程)

程序默认只有一个进程,fork()函数调用, 共有2个进程
程序默认只有一个线程,pthread_create()函数调用, 共有2个线程

函数介绍

一般情况下, main函数所在的线程称之为主线程(main线程,其余创建的线程称之为子线程)
程序默认只有一个进程,fork()函数调用, 2个进程
程序默认只有一个线程,pthread_create()函数调用, 2个线程

#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                    void *(*start_routine) (void *), void *arg);
    - 功能: 创建一个子线程
    - 参数:
        - thread: 传出参数, 线程创建成功后,子线程ID被写入该变量
        - attr: 设置线程的属性, 一般使用默认值,NULL
        - start_routine: 函数指针, 这个函数是子线程需要处理的逻辑代码
        - arg: 给第三个参数使用, 函数指针的参数可以通过arg指定
    - 返回值: 
        成功0; 
        失败返回错误号,和之前的errno不一样, 无法使用perror()
            获取错误号信息: char* strerror(int errnum);
    编译和链接时需要参数 -pthread (等同-lpthread)

示例代码:

#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

//子线程输出
void* callback(void* arg){
    printf("child thread...\n");
    printf("arg value: %d\n", *(int*)arg); //获取第四个传入的参数
    return NULL;
}

int main(){
    pthread_t tid;
    int num = 10;

    //创建一个子线程
    int ret = pthread_create(&tid, NULL, callback, (void*)&num);

    if(ret != 0)
    {
        char* errstr = strerror(ret);
        printf("error: %s\n", errstr);
    }

    int i;
    for(i = 0; i<5; i++)
    {
        printf("%d\n",i);
    }

    sleep(1); // 解决:还未执行子线程, 主线程就退出的问题

    return 0;
}

运行结果

0
1
2
3
4
child thread...
arg value: 10

标签:02,attr,int,create,pthread,线程,arg,多线程
From: https://www.cnblogs.com/anqwjoe/p/17504439.html

相关文章

  • Linux多线程04-连接已终止的线程
    pthread_join描述:pthread_join()函数等待由thread指定的线程终止。如果该线程已经终止,则pthread_join()将立即返回。由thread指定的线程必须是可连接的。如果retval不为NULL,则pthread_join()将目标线程的退出状态(即目标线程提供给pthread_exit(3)的值)复制到retval指向的......
  • Linux多线程03-终止线程
    pthread_exit和pthread_self和pthread_equal描述:pthread_exitpthread_exit()函数终止调用该函数的线程,并通过retval返回一个值,如果该线程是可连接的,则在同一进程中调用pthread_join(3)的另一个线程可以获取该值。任何由pthread_cleanup_push(3)建立但尚未弹出的清理处......
  • Linux多线程07-线程属性
    线程属性类型:pthread_attr_t描述:pthread_attr_setdetachstate()函数将由attr引用的线程属性对象的分离状态属性设置为detachstate中指定的值。分离状态属性确定使用线程属性对象attr创建的线程将在可连接状态还是分离状态下创建。可以在detachstate中指定以下值:P......
  • Linux多线程06-线程取消
    pthread_cancel描述:pthread_cancel()函数向线程thread发送一个取消请求。目标线程对取消请求的响应取决于该线程控制的两个属性:其取消状态和类型。一个线程的取消状态由pthread_setcancelstate(3)确定,可以启用(对于新线程而言是默认的)或禁用。如果一个线程已禁用取消,则取消请......
  • Linux多线程05-线程的分离
    pthread_detach描述:pthread_detach()函数将由thread标识的线程标记为已分离。当一个分离的线程终止时,它的资源会自动释放回系统,而不需要另一个线程与已终止的线程加入。尝试分离一个已经分离的线程会导致未指定的行为。#include<pthread.h>intpthread_detach(pthread_tt......
  • Linux多线程08-线程同步
    一个多线程售票示例://三个窗口,共100张票#include<stdio.h>#include<pthread.h>#include<unistd.h>inttickets=100;//所有线程都共享这100张票void*sellticket(void*arg){//卖票while(tickets>0){usleep(6000);//间隔6000微秒p......
  • 官宣!2023云原生编程挑战赛正式启动
    随着越来越多的企业上云,企业的核心关注点转变为如何更好地利用云的能力,将产品快速推向市场,从而实现业务成功。但是,如果算力的呈现形式仍然是服务器这样的资源形态,它的使用门槛依然很高。让算力像电力一样的普及,云计算需要新的形态,就是Serverless。随着用好云成为关键,开发范式也......
  • 2023-06-25 uview组件Vtabs 垂直选项卡无法滑动位移
    前言:uni项目中导入uview的vtabs插件来做分页,奈何导入demo后发现无法实现滑动页面来自动选中左侧菜单。原因:大哥!请先看文档,文档里有写,设置chain为true即可左右联动!好吧,是我没留意。解决方案:设置vtabs属性chain为true,官网示例代码:<template><viewclass="content">......
  • 【专题】2022年中国跨境电商行业研究报告PDF合集分享(附原数据表)
    全文链接:http://tecdat.cn/?p=32044近年来,我国的跨境电子商务发展迅速,在过去五年中,其贸易额增长率达到了16.2%,已经成为稳定对外贸易的一支重要力量一方面,随着跨境电子商务的发展,跨境电子商务的监管政策得到了进一步的改善,跨境电子商务的规模也得到了进一步的扩大,整个电子商务的......
  • 02 CRUD员工
    完善登录功能问题因为可以没有登录就直接跳转到index页面,所以我们必须要增加一个拦截器或者过滤器,在过滤器中判断用户是否已经完成登录,只有登录成功后才可以访问系统中的页面。代码实现先在reggie下创建一个filter包,新建一个LoginCheckFilter类:packagecom.itheima.reg......