小编Rah*_*mri的帖子

读取/预制系统调用的线程安全性

我在多线程环境中几乎没有与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()是否真的会有问题,我正在考虑.我正在阅读的文件是一个二进制文件,因此我很难快速手动阅读和验证..

任何帮助将不胜感激

c multithreading asynchronous thread-safety

8
推荐指数
1
解决办法
5301
查看次数

对会员功能的重复呼叫会受到伤害吗?

我已经用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中关心这个,因为,我们都知道为什么.但是,我希望我的代码可读,并使用privatepublic关键字来正确反映要做的事情.

c++ performance inline function member-functions

1
推荐指数
2
解决办法
399
查看次数