linuxは無名パイプpipeと有名パイプfifoでスレッド間通信を実現
2585 ワード
1.pipe
同じプロセスで実装された異なるスレッド間の通信(IPCプロセス間通信における血縁関係を持つプロセス通信実装方式と同様)
2.fifo
異なるプロセスを実現するためのスレッド間通信.異なるプロセスのスレッド間の通信は、異なるプロセス間の通信と同等である.
リードスレッド
書き込みスレッド
同じプロセスで実装された異なるスレッド間の通信(IPCプロセス間通信における血縁関係を持つプロセス通信実装方式と同様)
#include
#include
#include
#include
#include
using namespace std;
void *func(void * fd)
{
char str[] = "this is write thread!
";
write( *(int*)fd, str, strlen(str) );
}
int main()
{
int fd[2];
char readbuf[1024];
if(pipe(fd) < 0)
{
printf("pipe error!
");
}
pthread_t tid = 0;
pthread_create(&tid, NULL, func, &fd[1]);
pthread_join(tid, NULL);
sleep(3);
// read buf from child thread
read( fd[0], readbuf, sizeof(readbuf) );
printf("read buf = %s
", readbuf);
return 0;
}
2.fifo
異なるプロセスを実現するためのスレッド間通信.異なるプロセスのスレッド間の通信は、異なるプロセス間の通信と同等である.
リードスレッド
#include
#include
#include
#include
#include
#include
#include
#include
void *func(void *fd)
{
char readbuf[1024];
read( *(int*)fd, readbuf, 30);
printf("this is Thread_read!
");
printf("Receive message: %s
", readbuf);
close(*(int*)fd);
}
int main()
{
int fd;
char buff[2048];
if(mkfifo("fifo", 0666) < 0 && errno != EEXIST)
{
printf("create FIFO falied!
");
return 0;
}
fd = open("fifo", O_RDONLY);
if(fd < 0)
{
printf("open FIFO falied!
");
}
pthread_t tid = 0;
pthread_create(&tid, NULL, func, &fd);
pthread_join(tid, NULL);
//sleep(3);
return 0;
}
//g++ -o Thread_read Thread_read.cpp -lpthread
書き込みスレッド
#include
#include
#include
#include
#include
void *func(void * fd)
{
int wri = write(*(int*)fd, "this is Thread_write", 30);
if(wri < 0)
{
printf("wirte fifo failed!
");
}
close(*(int*)fd);
}
int main()
{
int fd = open("fifo", O_WRONLY);
if(fd < 0)
{
printf("open fifo failed!
");
return 0;
}
pthread_t tid = 1;
pthread_create(&tid, NULL, func, &fd);
pthread_join(tid, NULL);
// sleep(3);
return 0;
}
//g++ -o Thread_write Thread_write.cpp -lpthread