gpt4 book ai didi

c - volatile 关键字用于指针数组对象,用于经常变化的网络数据包信息容器 C

转载 作者:行者123 更新时间:2023-12-04 15:03:04 26 4
gpt4 key购买 nike

我有一个这样的结构指针数组

   struct packets *p=(struct packets *)malloc(sizeof(struct packets)*30);

程序分为两步

Step 1) in producer thread I am getting network packets from RX-Ring (from Packet MMAP)

Step 2) and In consumer thread I am responding packets carrying syn=1,ack=0 received in step 1using TX-Ring (Again Packet MMAP)

算法是这样的

更新 -- 真的很抱歉我写错了,真正的算法如下

    main()
pthread_create step1;// Detached thread // while loop inside
pthread_create step2;//Detached thread // another while loop inside
end main

struct packets *p 是接收和响应 IP 数据包的数据包列表。我听说过 volatile 对象会阻止编译器优化。 *p 只分配一次,我在 struct packets 中使用字段来指示对 *p 数组的单个元素执行的最后一个操作(无论是生产者执行最后一个操作还是消费者执行最后一个操作)从谷歌搜索 volatile 对象我发现以下信息

The volatile keyword is intended to prevent the compiler from applying any optimizations on objects that can change in ways that cannot be determined by the compiler. Objects declared as volatile are omitted from optimization because their values can be changed by code outside the scope of current code at any time.26-Apr-2020

所以我想知道如果我将 struct packets *p 指针用作 volatile 是否可以,因为值会经常更改。

我正在用 C 编写代码

struct packets *p指针数组的分配只发生一次

更新

*p 是全局的。并像 pthread_once 一样在接收器中分配一次

我还使用条件变量向发送线程发送数据包已收到的信号

再次抱歉

最佳答案

数据包缓冲区是否被多个线程访问?如果不是,则不需要使用 volatile 关键字,因为编译器可以跟踪此变量的更改,事实上,让编译器正常优化可能是个好主意。它“经常更改”这一事实完全无关紧要。

另一方面,如果您确实从多个线程(或者说,一个中断服务例程)访问缓冲区,或者其他一些进程修改了您不知道的数据,那么您应该将缓冲区声明为 volatile ,但也可以使用类似 mutex or semaphore 的东西以防止竞争条件。

PS:在你更新问题后,第二种情况看起来肯定是真的。建议将其声明为易变的,并使用适当的同步。

(在其中一条评论中分享的 This answer 有关于 volatile 解决问题的更详细信息。)

关于c - volatile 关键字用于指针数组对象,用于经常变化的网络数据包信息容器 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66637248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com