一、多线程工作机理
进程里创建一个子线程时,实际上会复制自身的一个进程,在这个进程里去运行该子线程。这个进程复制原有的变量和环境等,跟fork创建子进程不同。主要过程是主线程创建子线程,(子线程工作),主线程等待子线程结束。
二、线程创建
创建线程时,第一个参数给子线程一个ID,用于标识线程。第三个给线程指定运行函数的指针,第四个指定函数输入的参数值。第二个参数还可以设置线程属性。
pthread_create(pthread_t* id,const pthread_attr_t* attr,(void*)(*start_rtn)(void*),void *arg)
三、等待结束线程
pthread_join(pthread_t id,void** retval)
主线程阻塞等待该id标识的子线程,第二个参数可以存储子线程返回值。该函数一个作用可以防止子线程未运行完主线程就退出了,另一个作用是释放子线程运行时复制的进程的资源。
四、demo
#include<stdio.h>
#include<stdlib.h>
void pthread0();
void pthread1(int a);
void pthread0()
{
int count=3;
while(count>0){
printf("pthread0\n");
sleep(2);
count--;
}
}
void pthread1(int a)
{
int b;
b=a;
while(b>0){
printf("pthread1,time left=%d\n",b);
sleep(2);
b--;
}
}
int main()
{
pthread_t id0;
pthread_t id1;
int i=2;
pthread_create(&id0,NULL,(void *)pthread0,NULL);
pthread_create(&id1,NULL,(void *)pthread1,i);
pthread_join(id0,NULL);
pthread_join(id1,NULL);
return 0;
}
五、编译命令链接
gcc -o thread thread.c -lpthread