我在多线程环境中几乎没有与read()/ pread()系统调用相关的查询
我正在使用基于freeBsd的Mac-OSX,如果这有助于我在读模式下只使用这个文件,而不是读/写而且语言是c/c ++
假设我们在磁盘AAAABBBBCCCCDDDEEEE上有一个文件....
和4个字母适合文件的一页
所以Page1:AAAA
第2页:BBBB .....等等
现在我从具有相同文件描述符的两个不同线程发起读取系统调用,我的意图是从线程1读取第一页,从线程2读取第二页,等等.
阅读(FD,浅黄色,的sizeof(页));
从手册页我得知理解读取也会增加文件指针,所以我肯定会得到像我这样的乱码
ABCC ABBB ..等(没有特别的顺序)
为了解决这个问题,我可以使用pread()
"Pread()执行相同的功能,但从文件中的指定位置读取而不修改文件指针"//来自手册页
但我不确定使用pread是否真的会帮助我实现目标,因为即使它没有增加内部文件指针,也无法保证响应不会混乱.
我的所有数据都是页面对齐的,我想从每个线程中读取一页
线程1读取:AAAA线程2读取:BBBB线程3读取:CCCC ...没有实际乱画内容..
我还发现一个帖子一旦write()返回,从文件中读取是否安全?
但它不是很有用.
我也不确定read()是否真的会有问题,我正在考虑.我正在阅读的文件是一个二进制文件,因此我很难快速手动阅读和验证..
任何帮助将不胜感激
我已经用Java和C编程了,现在我想用C++弄脏自己.
鉴于此代码:
class Booth {
private :
int tickets_sold;
public :
int get_tickets_sold();
void set_tickets_sold();
};
Run Code Online (Sandbox Code Playgroud)
在Java中,无论我需要什么值tickets_sold
,我都会反复调用getter.
例如:
if (obj.get_tickets_sold() > 50 && obj.get_tickets_sold() < 75){
//do something
}
Run Code Online (Sandbox Code Playgroud)
在CI中,只需获取结构中特定变量的值:
if( obj_t->tickets_sold > 50 && obj_t->tickets_sold < 75){
//do something
}
Run Code Online (Sandbox Code Playgroud)
因此,当在C中使用结构时,我节省了两次调用,否则我将在Java中使用,两个getter就是,我甚至不确定这些是实际调用还是Java以某种方式内联这些调用.
我的观点是,如果我使用与C++中的Java相同的技术,那两个对getter成员函数的调用是否会花费我,或者编译器是否知道内联代码?(从而减少了函数调用的开销?)
或者,我最好使用:
int num_tickets = 0;
if ( (num_tickets = obj.get_ticket_sold()) > 50 && num_tickets < 75){
//do something
}
Run Code Online (Sandbox Code Playgroud)
我想编写严格的代码并避免不必要的函数调用,我会在Java中关心这个,因为,我们都知道为什么.但是,我希望我的代码可读,并使用private
和public
关键字来正确反映要做的事情.