• 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



  • 相关阅读:
    windows下编译php7图形库php_ui.dll
    php 图形用户界面GUI 开发
    使用PHPStorm 配置自定义的Apache与PHP环境
    公用代码实现两个表的拼接(部分代码)
    WCF学习心得--客户端获取服务端自定义类数据
    动态规划入门——Eddy's research II
    linux route命令学习
    软件度量都该度个啥?(5)——被吹得最多的六西格玛
    VSS的运用小内容(针对于vs2008版本)(小的问题都是,仅供参考--只针对于菜鸟级的)
    cocos2d-x学习日志(13) --A星寻路算法demo
  • 原文地址:https://www.cnblogs.com/smartxuchao/p/6440531.html
Copyright © 2020-2023  润新知