多线程中通讯
#include <sys/eventfd.h>
int eventfd(unsigned int initval, int flags);
第一个参数是一个值。
第二个参数是模式。(暂时不管他)
#include <sys/eventfd.h>
#include <iostream>
#include <unistd.h>
int main()
{
int efd=eventfd(10,0);
std::cout<<"eventfd result: "<<efd<<std::endl;
int ret=fork();
int result;
if(ret == 0)
{
uint64_t i=20;
result=write(efd,&i,sizeof(i));
std::cout<<"child write: "<<result<<std::endl;
}else{
sleep(1);
uint64_t i;
result = read(efd,&i,sizeof(i));
std::cout<<"parent result: "<<result<<" "<<i<<std::endl;
result = read(efd,&i,sizeof(i));
std::cout<<"parent result: "<<result<<" "<<i<<std::endl;
}
}
输出结果为:
该函数可以在父进程和子进程间从当一个
wait/notify
的作用,而且只能用于唤醒一次,读取以后,值归零。阻塞于read调用。
需要注意的是写入和读取时候值的类型一定要是uint64_t
。
至于第二个参数,可以设置为O_NONBLOCK
,当值为零时,会直接返回失败,并把error置为EINVAL。