目錄
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);
}
多線程并發運行可能會同時對一個數據進行操作,導致兩個操作只改變了一次結果,導致程序運行錯誤