在多线程程序中通过用户事件传递短数据的正确方法是什么
What is a correct way of passing short data through user events in multi-threaded programs?
在我的基于 SDL2 的程序中,我有一个处理事件队列的主线程,另一个线程定期将事件推送到它。
// thread #2
event.type = UserEventType;
event.user.code = SomeCode;
event.user.data = UInt8Value;
SDL_PushEvent(&event);
主线程获取此事件,并提取数据。
// main thread
SDL_PollEvent(&event); /* ... */
Uint8 Uint8Value = event.user.data;
这个解决方案似乎并不好,因为 Uint8 和 void* 的大小不同,并且取决于平台。最安全的方法是在堆中分配 Uint8 值,并通过 event.user.data 将指针传递给它,并在主线程中释放内存。但当您只需要传递一个字节时,为每个事件分配/释放内存不是效率低下吗?也许有更好的解决方案也是便携式的?
形成循环队列的事件容器呢?您可以加载下一个空闲元素,然后将其地址推送到队列中。然后,使用者/主用户可以取消引用它。它仍然效率低下,但至少你避免了新建/删除微小结构的痛苦。
这里有一种方法可以做到这一点
// All the possible character values
// Make this a global
char dummy_values[256];
// thread #2
event.type = UserEventType;
event.user.code = SomeCode;
event.user.data = dummy_values + UInt8Value;
SDL_PushEvent(&event);
// main thread
SDL_PollEvent(&event); /* ... */
Uint8 Uint8Value = static_cast<char*>(event.user.data) - dummy_values;
这是 256 字节数组的成本,但它避免了动态内存,应该是安全和可移植的
相关文章:
- 通过JNI传递数据数组的最快方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 在C++中查找像素 RGB 数据的最快方法是什么?
- C++中deque数据结构的大O是什么?
- 数据类型"struct seq<0, 1, 2>{}"含义是什么?
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 处理编译器关于可能丢失数据的警告的最优雅方法是什么
- 自定义数据结构的优点是什么?
- DLL共享数据的推荐方式是什么
- 在wxWidgets的事件中包含我自己的数据的最佳方法是什么?
- 用于筛子的最佳数据结构是什么(即一些被划掉的数字列表)?
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 多维数据集ai中的ai_float是什么
- MySQL c++ 连接器:使用 SetBlob() 在查询中设置多个 blob 数据的正确方法是什么?
- 在 .text 部分中定义只读数据的原因是什么?
- 在C++和Python之间交换数据的最快方法是什么?
- C++:文本文件中的数据是什么类型的