Learn how easy it is to sync an existing GitHub or Google Code repo to a SourceForge project! See Demo

Close

Multithread smart pointers, vs 2008; errors

Developers
Laethnes
2012-07-09
2013-04-08
  • Laethnes
    Laethnes
    2012-07-09

    First, I apologize for my English.

    Short problem description:
    I have problem with SmartPtr in multi threaded application and I'm not sure what I'm doing wrong, because some symbols are missing during linking.

    My environment:
    - MS Windows XP, SP3
    - compiler from MS Visual Studio 2008
    - QtCreator IDE
    - Loki version: 0.1.7

    Loki linking:
    I compile it separately as static library using solution file in source file downloaded from Loki home web page.

    My goal:
    I want to create SmartPtr of an object ("ReconstructResult" type) which would use reference counting thread-safe (so RefCounted is unusable).

    How do I do this:
    - I use typedef of pointer type:

    #include <loki/SmartPtr.h>
    #include <loki/Threads.h>
    // ...
    typedef Loki::SmartPtr<ReconstructResult,
                            Loki::RefCountedMTAdj<Loki::ObjectLevelLockable>::RefCountedMT
                            > ReconstructResultPtr;
    

    - I define global macro "LOKI_OBJECT_LEVEL_THREADING" (no value) for whole project (it's defined in project file, so there shouldn't be problems like defining this macro after including headers).

    What's wrong:
    - At first compiler was complaining about undefined atomic_mutex_. This I solved using patch  which I found thanks to  (btw. similar error is reported at ).
    - After this patch the error was solved and code finally compiled.
    - But another error appeared during linking:

    ModelViewWidget.obj:-1: Chyba:LNK2001: unresolved external symbol "private: static struct _RTL_CRITICAL_SECTION Loki::ObjectLevelLockable<class Loki::RefCountedMTAdj<class Loki::ObjectLevelLockable,class Loki::Mutex>::RefCountedMT<class Laethnes::ReconstructResult *>,class Loki::Mutex>::atomic_mutex_" (?atomic_mutex_@?$ObjectLevelLockable@V?$RefCountedMT@PAVReconstructResult@Laethnes@@@?$RefCountedMTAdj@VObjectLevelLockable@Loki@@VMutex@2@@Loki@@VMutex@3@@Loki@@0U_RTL_CRITICAL_SECTION@@A)
    

    - and similar (same error, different obj files - these which uses the pointer).
    - I solved it by adding following code to "loki/Threads.h":

    #ifdef LOKI_WINDOWS_H
        template <class Host, class MutexPolicy>
        CRITICAL_SECTION ObjectLevelLockable<Host, MutexPolicy>::atomic_mutex_;
    #endif
    #ifdef LOKI_WINDOWS_H
        template <class Host, class MutexPolicy>
        CRITICAL_SECTION ClassLevelLockable<Host, MutexPolicy>::atomic_mutex_;
    #endif
    

    My problem:
    - My problem is that I couldn't find any similar error report on Internet which means that people who posted patch at  and  didn't encounter it. From this I conclude that I'm doing something wrong which causes this error. And I don't know what it is, so I ask you.
    - Also I don't know if my patch is good; I'm not good in using templates, I know only basics, using typename and specialization.

    Links:
    https://sourceforge.net/projects/loki-lib/forums/forum/93008/topic/3183593
    https://sourceforge.net/tracker/?func=detail&aid=2752624&group_id=29557&atid=396644
    http://loki-lib.svn.sourceforge.net/viewvc/loki-lib/trunk/include/loki/Threads.h?sortdir=down&r1=985&r2=1015&sortby=rev