在多线程程序中通过用户事件传递短数据的正确方法是什么

What is a correct way of passing short data through user events in multi-threaded programs?

本文关键字:数据 是什么 方法 程序 多线程 事件 用户      更新时间:2023-10-16

在我的基于 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 字节数组的成本,但它避免了动态内存,应该是安全和可移植的