在一个进程中的多个执行线路就是线程。准确的说线程是进程内部的一条执行路径
从分配资源的角度--------》进程的属性
从调度、执行的角度--------》线程的属性
某一时刻两个线程都在执行---------》(并行)
某一时间段内两个线程都在执行-----------》(并发)交替执行
一般而言,线程之间的切换需要操作系统做的工作要比进程之间的切换少得多,因此多个线程对资源的需求要远小于多个进程。
pthread_creat:创建线程
pthread_exit:退出线程
pthread_join:等价于进程中用来收集子进程信息的wait函数
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<pthread.h>
void* thread_fun(void *arg)
{
int i=0;
for(;i<10;i++)
{
printf("fun run\n");
sleep(1);
}
pthread_exit("fun over");
}
int main()
{
pthread_t id;
pthread_create(&id,NULL,thread_fun,NULL);//创建线程,已经被创建出来的线程和主线程并发
//传递了一个 pthread_t类型对象的地址,可以用它来引用这个新的线程,我们不想改变默认的线程属性,所以设置第二个参数为NULL
//thread_fun是线程将要调用新的函数,NULL是一个传给该函数的参数
//调用成功后将会有两个线程执行。原先的线程main继续执行pthread_create后的代码,而新线程开始执行thread_fun()函数
int i=0;
for(;i<5;i++)
{
printf("main run\n");
sleep(1);
}
char *s= NULL;
// pthread_join(id,(void **)&s);//主线程先于子线程结束,这时子线程正常执行
exit(0);//主线程结束程序退出,子线程也结束
}
如下图:主线程先于子线程退出,子线程正常运行
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<pthread.h>
void* thread_fun(void *arg)//用同一个线程函数
{
int index = *((int* )arg);
int i=0;
for(;i<5;i++)
{
printf("index=%d\n",index);
sleep(1);
}
}
int main()
{
pthread_t id[5];
int i=0;
for(;i<5;i++)
{
pthread_create(&id[i],NULL,thread_fun,(void*)&i);//创建线程,已经被创建出来的线程和主线程并发,主线程的执行速度比子线程快得多
//此时主线程的i是几 拿到的就是几
//sleep(1);//每隔一秒创建一个进程
}
for(i=0;i<5;i++)
{
pthread_join(id[i],NULL);
}
exit(0);
}
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<pthread.h>
int g=0;
void* thread_fun(void *arg)//用同一个线程函数
{
int i=0;
for(;i<1000;i++)
{
printf("g=%d\n",++g);
}
}
int main()
{
pthread_t id[5];
int i=0;
for(;i<5;i++)
{
pthread_create(&id[i],NULL,thread_fun,NULL);//创建线程,已经被创建出来的线程和主线程并发
//sleep(1);
}
for(i=0;i<5;i++)
{
pthread_join(id[i],NULL);
}
exit(0);
}
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<pthread.h>
#include<semaphore.h>
int g=0;
sem_t sem;//使用信号量对线程进行控制
void* thread_fun(void *arg)//用同一个线程函数
{
int i=0;
for(;i<1000;i++)
{
sem_wait(&sem);
printf("g=%d\n",++g);
sem_post(&sem);
}
}
int main()
{
sem_init(&sem,0,1);//
pthread_t id[5];
int i=0;
for(;i<5;i++)
{
pthread_create(&id[i],NULL,thread_fun,NULL);//创建线程,已经被创建出来的线程和主线程并发
//sleep(1);
}
for(i=0;i<5;i++)
{
pthread_join(id[i],NULL);
}
sem_destroy(&sem);//
exit(0);
}
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<pthread.h>
void* thread_fun(void *arg)//用同一个线程函数
{
char str[]={"a b c d e f g h k l"};
char *s=strtok(str," ");
while(s !=NULL)
{
printf("s=%s\n",s);
sleep(1);
s=strtok(NULL," ");
}
}
int main()
{
pthread_t id;
pthread_create(&id,NULL,thread_fun,NULL);//创建线程,已经被创建出来的线程和主线程并发
char arr[]={"1 2 3 4 5 6 7 8 9"};
char *p=strtok(arr," ");
while(p!=NULL)
{
printf("p=%s\n",p);
sleep(1);
p=strtok(NULL," ");
}
pthread_join(id,NULL);
exit(0);
}