学习之路--pthread多线程的操作

我之前不怎么使用多线程,直到发现将所有的代码杂糅在一个进程中,会特别的卡,但其实CPU的使用率并不是很高,所以采用多任务处理,并发执行的操作就能优化整个程序。

所以,进入主题--------pthread。

Linux中实现多线程的操作

linux系统中包含pthread库,实现多线程比较简单,下面就是一个实例:

主线程负责发送数据

子线程实现接收数据

 

包含头文件:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>  
#include <sys/ipc.h>     // 进程间通信
#include <sys/msg.h>   //消息队列
#include <string.h>
#include <unistd.h>  
#include <pthread.h>   //包含thread 库

新建一个消息的结构体

struct msgbuf
{
long mtype;    // 消息的类型
char mtex[40];  // 消息的大小
};

//定义两个结构体,一个是负责发送消息的结构体,另一个是负责接收消息的结构体

struct msgbuf msre, mswr;

//结束消息通信的变量
char end[5] = { "end\n" };

/////////////////////////////////////////////////////////////////

//子线程:接收数据

/////////////////////////////////////////////////////////////////

void *recv(void *buf)
{

while (1) //son thread
 {
    key_t key = ftok(".", 123); //key_t is similar with int or long type , ftok get IPC communication id,the frist parameter is file path,the second is behind 8bit num of id.
    sleep(1);
    int msid = msgget(key, IPC_CREAT | 0666);//(read|write)
    bzero(msre.mtex, 40);//msre full 0
    if (msgrcv(msid, (void *)&msre, sizeof(msre), 100, 0) == -1)//get mtype in the msid=100 of mssage queue,and putit in msre, if msid don't geted , will blocking
   {
         perror("get message fail");
         exit(-1);
    }
    printf("message :%s\n", msre.mtex);
    if (strcmp(msre.mtex, end) == 0)
    {
       msgctl(msid, IPC_RMID, NULL);  // message end
       printf("pthread end!\n");
       exit(0);
     }
     printf("Please import message :\n");
    }
}//主要负责接收主线程发送过来的数据,注意红色的100,这是消息的类型,要求与主线程的消息类型保持一致

 ////////////////////////////////////////////////////////////////////////////

//主线程:负责发送消息

///////////////////////////////////////////////////////////////////////////

int main(void)
{
    key_t key = ftok(".", 123); //key_t is similar with int or long type , ftok get IPC communication id,the frist parameter is file path,the second is behind 8bit num of id.
    int msid = msgget(key, IPC_CREAT | 0666);// (read|wirte)
    if (msid < 0)
    {
        perror("get msgid fail");
        return;
    }
    system("ipcs -q");  // show  message
    mswr.mtype = 100;  // must same whit msre
    char a[40] = { '\0' };
    pthread_t id;
    pthread_create(&id, NULL, recv, NULL); // new a thread recv
    printf("Please import message:\n");//
    while (1)// main thread
    {
        bzero(mswr.mtex, 40);
        fgets(mswr.mtex, 40, stdin);
        sleep(1);
        if (msgsnd(msid, (void *)&mswr, strlen(mswr.mtex), 0) == -1)//put mswr in msid of message queue ,and size is strlen,IPC_NOWAIT is no blocking.
        {
            perror("send fail");
            return 0;
        }
        printf("string :%s", mswr.mtex);
        if (strcmp(mswr.mtex, end) == 0)
        {
            printf("main pthread end!\n");
            msgctl(msid, IPC_RMID, NULL);
            exit(0);
        }
     }
pthread_join(id, NULL);

}

实现效果:

 

posted on 2017-12-29 14:15  莫问人生  阅读(1799)  评论(0编辑  收藏  举报