- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个这样的结构指针数组
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/
我刚接触 C 语言几周,所以对它还很陌生。 我见过这样的事情 * (variable-name) = -* (variable-name) 在讲义中,但它到底会做什么?它会否定所指向的值吗? 最佳答案
我有一个指向内存地址的void 指针。然后,我做 int 指针 = void 指针 float 指针 = void 指针 然后,取消引用它们以获取值。 { int x = 25; vo
我正在与计算机控制的泵进行一些串行端口通信,我用来通信的 createfile 函数需要将 com 端口名称解析为 wchar_t 指针。 我也在使用 QT 创建一个表单并获取 com 端口名称作为
#include "stdio.h" #include "malloc.h" int main() { char*x=(char*)malloc(1024); *(x+2)=3; --
#include #include main() { int an_int; void *void_pointer = &an_int; double *double_ptr = void
对于每个时间步长,我都有一个二维矩阵 a[ix][iz],ix 从 0 到 nx-1 和 iz 从 0 到 nz-1。 为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针
我有一个函数,它接受一个指向 char ** 的指针并用字符串填充它(我猜是一个字符串数组)。 *list_of_strings* 在函数内部分配内存。 char * *list_of_strings
我试图了解当涉及到字符和字符串时,内存分配是如何工作的。 我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。 另一方面,当我们想要使用内存堆时,我们使用 malloc,
我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。 typedef struct { char *snsAccessID; char *
我得到了以下数组: let arr = [ { children: [ { children: [], current: tru
#include int main(void) { int i; int *ptr = (int *) malloc(5 * sizeof(int)); for (i=0;
我正在编写一个程序,它接受一个三位数整数并将其分成两个整数。 224 将变为 220 和 4。 114 将变为 110 和 4。 基本上,您可以使用模数来完成。我写了我认为应该工作的东西,编译器一直说
好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案.... 我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下: 标题: class
1) this 指针与其他指针有何不同?据我了解,指针指向堆中的内存。如果有指向它们的指针,这是否意味着对象总是在堆中构造? 2)我们可以在 move 构造函数或 move 赋值中窃取this指针吗?
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C : pointer to struct in the struct definition 在我的初学者类
我有两个指向指针的结构指针 typedef struct Square { ... ... }Square; Square **s1; //Representing 2D array of say,
变量在内存中是如何定位的?我有这个代码 int w=1; int x=1; int y=1; int z=1; int main(int argc, char** argv) { printf
#include #include main() { char *q[]={"black","white","red"}; printf("%s",*q+3); getch()
我在“C”类中有以下函数 class C { template void Func1(int x); template void Func2(int x); }; template void
我在64位linux下使用c++,编译器(g++)也是64位的。当我打印某个变量的地址时,例如一个整数,它应该打印一个 64 位整数,但实际上它打印了一个 48 位整数。 int i; cout <<
我是一名优秀的程序员,十分优秀!