issue with Threadsafe singleton with semaphore

后端 未结 2 1903
野的像风
野的像风 2021-01-13 17:03

I have written a simple singleton application.

The following is my sample main class

// ThreadsafeSingletonUsingSemaphore.cpp : Defines the entry poi         


        
相关标签:
2条回答
  • 2021-01-13 17:11

    You don't need to write all of that code. The easiest way to implement a threadsafe singleton is to use Scott Meyer's singleton idiom:

    class Singleton {
        int counter;
        mutable std::mutex counter_guard;
        Singleton() {}
    public:
        Singleton(const Singleton&) = delete;
        Singleton(Singleton&&) = delete;
        Singleton& operator=(const Singleton&) = delete;
        Singleton& operator=(Singleton&&) = delete;
    
        static Singleton& instance() {
            static Singleton theInstance;
            return theInstance;
        }
    
        void setCounter(int newVal) {
            std::unique_lock<std::mutex> lock(counter_guard);
            counter = newVal;
        }  
        void incrementCounter() {
            std::unique_lock<std::mutex> lock(counter_guard);
            ++counter;
        }  
        int getCounter() const {
            std::unique_lock<std::mutex> lock(counter_guard);
            return counter;
        }  
    };
    

    An even easier way would be to use a std::atomic<int> type for the counter member variable. Then the mutex and lock guards can be omitted at all.

    0 讨论(0)
  • 2021-01-13 17:23

    The problem is that call to WaitForMultipleObjects handles up to MAXIMUM_WAIT_OBJECTS which, at least in Visual Studio 2017, is 64.

    Notice how your call to WaitForMultipleObjects to join threads returns WAIT_FAILED.

    In order to wait for more objects one should, according to the documentation:

    To wait on more than MAXIMUM_WAIT_OBJECTS handles, use one of the following methods:

    • Create a thread to wait on MAXIMUM_WAIT_OBJECTS handles, then wait on that thread plus the other handles. Use this technique to break the handles into groups of MAXIMUM_WAIT_OBJECTS.
    • Call RegisterWaitForSingleObject to wait on each handle. A wait thread from the thread pool waits on MAXIMUM_WAIT_OBJECTS registered objects and assigns a worker thread after the object is signaled or the time-out interval expires.
    0 讨论(0)
提交回复
热议问题