• Linux线程的创建


    一、线程与进程的区别

    1、线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

    2、进程是资源分配的基本单位。所有与该进程有关的资源,都被记录在进程控制块中。以表示该进程拥有这些资源或正在使用它们。

    3、进程也是抢占处理机的调度单位,它拥有一个完整的虚拟地址空间。当进程发生调度时,不同的进程拥有不同的虚拟地址空间,而同一进程内的不同线程共享同一地址空间。

    4、地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
    5、通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
    6、调度和切换:线程上下文切换比进程上下文切换要快得多。

    二、线程的创建

    <span style="font-size:18px;">int pthread_create(pthread_t *restrict thread,
                               const pthread_attr_t *restrict attr,
                               void *(*start_routine)(void *),
                               void *restrict arg
                              );</span>

    第一个参数thread 是指向pthread_t的指针
    第二个参数是指创建线程的属性,一般设为NULL,表示默认属性
    第三个参数是函数指针,指向入口函数的地址即函数名
    第四个参数是创建线程的回调函数的参数。

    函数的返回值
    0表示创建成功,非零表示创建失败

    三、不带参数的线程创建实例

    </pre><pre name="code" class="cpp">#include<stdio.h>
    
    #include<pthread.h>
    
    
    
    void *thread1(void)
    
    {
    
    	while(1)
    
    	{
    
    	printf("i am is thread1\n");
    
        sleep(1);
    
    	}	
    
    }
    
    
    
    int main()
    
    {
    
    int ret;
    
    pthread_t id1;
    
    ret = pthread_create(&id1,NULL,(void *)thread1,NULL);
    
    if(ret != 0)
    
    {
    
    printf("thread1 create error quit\n");
    
    exit(1);
    
    }
    
    	while(1)
    
    	{
    
    	printf("i am main pthread\r\n");
    
    	sleep(1);
    
    	}
    
    	return 0;
    
    
    
    
    
    }





    编译和运行结果如下:记得编译的时候加上-lpthread

    四、带参数的线程创建实例

    <span style="font-size:18px;">#include<stdio.h>
    #include<pthread.h>
    struct argue
    {
    int id;
    char p;
    };
    void *thread1(void)
    {
    	printf("i am is thread1\n");		
    	
    }
    void *thread2(void *arg)
    {
    struct argue *ar=(struct argue *)arg;
    printf("i am thread2:arg is:%d  %c\n",ar->id,ar->p);
    
    
    }
    int main()
    {
    int ret;
    struct argue arg;
    printf("iam main threan\n");
    pthread_t id1,id2;
    ret = pthread_create(&id1,NULL,(void *)thread1,NULL);
    if(ret != 0)
    {
    printf("thread1 create error quit\n");
    exit(1);
    }
    arg.id=1;
    arg.p='w';
    ret = pthread_create(&id2,NULL,(void *)thread2,(void *)&arg);
    if(ret != 0)
    {
    printf("thread2 create error quit\n");
    exit(1);
    }
    
    
    sleep(3);
    	return 0;
    
    
    
    
    }</span>
    编译和运行结果如下:记得编译的时候加上-lpthread



  • 相关阅读:
    tcpdump 命令的常用选项:一
    Centos系统中 Systemd 的Unit文件配置说明
    如何使用PowerShell获取物理磁盘的信息
    tcpdump 命令的常用选项:二
    Google报告:大量被入侵的 Google Cloud 实例被用来挖掘加密货币
    Ubuntu中使用pdftk合并、分离PDF文档等操作
    tcpdump 命令的常用选项:三
    优麒麟Ubuntu Kylin 20.04 Pro SP1 上线
    为SSH登录设置电子邮件提醒
    图片上传并显示(兼容ie),图片大小判断
  • 原文地址:https://www.cnblogs.com/smartxuchao/p/6440531.html
Copyright © 2020-2023  润新知