For the last approach, I will show a solution that doesn't require any support from an operating system or runtime library. You can implement it with standard tools, for example, with a timer, list, and critical section.
Unlike the previous solutions, which followed a push model (a message triggers some code in the main thread that can't do much to prevent that), this approach requires cooperation from code running in a main thread. This code will periodically check (poll) whether a message has arrived.
To implement this kind of messaging system, both the main thread and the background thread must share some structure that can store a list of messages and which is thread-safe (can be safely used in a multi-threaded environment). We ...