After going multi-threaded, now sometimes getting duplicate or missing key events

What is the correct way to handle SDL in a multi-threaded application?

I’m writing an emulator. When I was using a single thread, the code worked great but I added a native Win32 menu bar to the SDL window and moved emulation logic to its own thread to prevent menu navigation from blocking everything else. Now I’m having issues with occasional missing or repeated key events. It seems to be worse the slower the PC specs. I’ve tried it on several from a Core 2 Duo up to an i7-8700k.

All SDL initialization, event polling and video rendering is done in the main thread. Isn’t this correct?

Alternatively, is there an another way to stop menu navigation from blocking? And/or is there a cross-platform way to add native looking menu bars? I’d prefer not to have to have separate menu code for Windows, Mac and Linux but I will if I have to.