目录
1、进程间通信IPC:
2、多线程
3、向消息队列中写入数据
4、从消息队列中读取数据
5、多线程:
6、将多线程的数据返回给主线程
7、并发和并行
1、进程间通信IPC:
信号量 共享内存 消息队列 管道 套接字
2、多线程
头文件<pthread.h>
创建 执行
消息类型可以是123456,如果消息类型是0,标识不区分小时类型,但是只有在接收的时候可以使用,发送的时候不能为0.
3、向消息队列中写入数据
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/msg.h>
struct mess
{
long type;
char buff[32];
};
int main()
{
int msgid=msgget((key_t)1234,PIC_GREAT|0600)
if(msgig==-1)
{
printf("msgget err\n ");
exit(1);
}
struct mess td;
td.type=1;
strcpy(td.buff,"hello1");
msgsnd(msgid,&dt,32,0);
}
4、从消息队列中读取数据
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/msg.h>
struct mess
{
long type;
char buff[32]
};
int main()
{
int msgid=msgget((key_t)1234,IPC_CREAT|0600);
if(msgid==-1)
{
printf("msgget err\n");
exit(1);
}
struct mess dt;
msrcv(msgid,&dt,32,0);
printf("dt.buff=%s",dt.buff);
exit(0);
}
读的时候可以指定要读取消息的类型,如果消息队列中没有这个给类型的消息就会堵塞
消息队列属于先进先出
有内核管理,只要不主动删除,他就一直存在在内存中
ipcs:查看
5、多线程:
进程:一个正在运行的程序。进程会有状态:就绪 运行 堵塞
创建线程
void*fun(void *arg)
{
pthread_exit();//退出当前线程,但是不会退出主线程
}
int main()
{
//创建第二天线程
pthread_t id;
pthread_create(&id,NULL,fun,NULL);
}
多线程运行结果不固定;
6、将多线程的数据返回给主线程
pthread_exit(返回值);
7、并发和并行
并发:在一段时间内两者都有运行
并行是一种特殊的并发,并行必须有两个处理器,这两个路径分别放在各自的处理器上执行。
多线程运行结果不确定
只要输出结果在范围之内,就是可以的
启动五个线程:
int g_count=1;
void* fun(void *arv)
{
for(int i=0;i<1000;i++)
{
printf("g_count=%d",g_count++);
}
}
int main()
{
pthread_t id[5];
for(int i=0;i<5;i++)
{
pthread_creat(&id[i],NULL,fun,NULL);
}
for(int i=0;i<5;i++)
{
pthread_join(id[i],NULL);//等待其他线程结束
}
exit(0);
}
多线程并发运行可能会同时对一个数据进行操作,导致两个操作只改变了一次结果,导致程序运行错误