消息队列
发送消息 1type 2 数据
获取消息 type 根据你要获取的类型获取消息,如果类型是0,则都可以获取任何类型的消息
线程:进程内部的一条执行路径
进程:一个正在运行的程序
单线程:只有一条执行路径
多线程:有多个执行路径
主函数的执行路径:主线程(主线程一旦结束所有都结束)
函数:子线程
并发执行:两个进程同时执行
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
void* fun(void *arg)
{
for(int int i=0;i<5;i++)
{
printf("fun run\n");
}
pthread_exit("fun over");
}
int main()
{
pthread_t id;
pthread_create(&id,NULL,fun,NULL);
for(int i=0;i<5;i++)
{
printf("main run\n");
}
char*s=NULL;
pthread_join(id,(void**)&s);
printf("%s\n",s);
}
编译时一定要引用-lpthread 这个库
创建一个线程:pthread_creat()
线程里面专用的结束方式直接退出这个线程这个线程:pthread_exit()(如果用exit()结束就会直接退出整个程序)。
等待一个线程结束如果这个线程没有结束就等:pthread_join()
理解程序的并发执行
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
void *thread_fun(void *arg)
{
int index=*(int*)arg;
for(int i=0;i<3;i++)
{
printf("index=%d\n",index);
sleep(1);
}
}
int main()
{
preadth_t id[5];
int i=0;
for(;i<5;i++)
{
pthread_create(&id[i],NULL,thread_fun,(void*)&i);//(void*)i
}
for(int i=0;i<5;i++)
{
pthread_join(id[i],NULL);
}
exit(0);
}
因为你传的是地址所以i的值不是一直不变的0-5都有可能每个人打印的有可能相同也可能不同
如果要每个线程打印的都是同一个值可以将(void*)&i 变成 (void *)i 这样每次传的值都是不变的
如果想传多个值可以传结构体
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
#include <semaphore.h>
sem_t sem;
int index=1;
void *thread_fun(void *arg)
{
for(int i=0;i<1000;i++)
{
sem_wait(&sem);
printf("index=%d\n",index++);
sem_post(&sem);
}
}
int main()
{
sem_init(&sem,0,1);
preadth_t id[5];
int i=0;
for(;i<5;i++)
{
pthread_create(&id[i],NULL,thread_fun,NULL);
}
for(int i=0;i<5;i++)
{
pthread_join(id[i],NULL);
}
sem_destroy(&sem);
exit(0);
}
当两个线程都要加同一个值,同时都加就相当于加了一次
因为是多核处理器,有两个处理器共同运行,可能少加几次,如果是一个处理器同一时刻只有一个运行,一个执行路径,不可能有某一时刻同时修改i
本来运行值应该是5000,但是可能少计几次小于5000
可以加一个信号量让一个进程执行完之后在执行下一个进程,不在乎哪一个进程先执行