一、线程与进程的区别
1、线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
2、进程是资源分配的基本单位。所有与该进程有关的资源,都被记录在进程控制块中。以表示该进程拥有这些资源或正在使用它们。
3、进程也是抢占处理机的调度单位,它拥有一个完整的虚拟地址空间。当进程发生调度时,不同的进程拥有不同的虚拟地址空间,而同一进程内的不同线程共享同一地址空间。
4、地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
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