"Fossies" - the Fresh Open Source Software Archive

Member "mapm_4.9.5a/MULTI_THREAD/README" (21 Feb 2010, 3963 Bytes) of package /linux/misc/old/mapm-4.9.5a.tar.gz:


As a special service "Fossies" has tried to format the requested text file into HTML format (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file.

    1 
    2 Information from  
    3 
    4 Martin Pfingstl (Martin.Pfingstl@epost.de)
    5  
    6 on using the multi-threaded capable functions of MAPM
    7 under MS Windows (using Microsoft Visual C++)
    8 
    9 The default MAPM library is *NOT* thread safe. Martin
   10 created a set of stand-alone function wrappers so
   11 the MAPM library is thread-safe when using these 
   12 function wrappers.
   13 
   14 The general idea is to create a 'semaphore' from the
   15 operating system which guarantees that only 1 thread
   16 will have access to a critical section of code. The 
   17 following 4 functions will need to be created which 
   18 will depend on the compiler you are using.
   19 
   20 void	m_apm_enter(void)
   21 void	m_apm_leave(void)
   22 void	m_apm_init_semaphore(void)
   23 void	m_apm_free_semaphore(void)
   24 
   25 
   26 The example in mapm_mt.c shows how it is done
   27 with the latest Microsoft compilers. Other compilers
   28 should have similiar functions if they support 
   29 multi-threaded applications.
   30 
   31 The general usage is as follows:
   32 
   33 1)  compile the library normally, with make, script, batch file, whatever.
   34 2)  compile mapm_mt.c to create mapm_mt.o[bj]
   35 3)  all MAPM functions which are thread safe will have '_mt' at the end.
   36     i.e., m_apm_sqrt becomes m_apm_sqrt_mt. all user defined functions 
   37     have a thread-safe equivalent which has '_mt' on the end.
   38 4)  in the C++ wrapper class, the MAPM datatype becomes MAPMMT.
   39 5)  compile your application using m_apm_mt.h instead of m_apm.h
   40 6)  link your app with mapm_mt.o[bj] *and* the original library.
   41 
   42 M. Ring   June, 2002
   43 
   44 ----->
   45 
   46 From Martin:
   47 
   48 In order to make code multi threading capable, one has two possibilities:
   49 Either one writes functions using no global parameters, or - second
   50 possibility - one makes the functions so that only one thread can execute
   51 them simultaneously.
   52 
   53 I implemented the second possibility and it works very good.
   54 
   55 The basic idea is:
   56 1. create a semaphore (mutual exclusive object, operating system ensures
   57 that only one thread can "have" it). Operating sytem provides functions for
   58 obtaining and releasing it. Once a thread has ownership of the semaphore,
   59 any other thread who wants ownership simply must wait (i.e. the ownership
   60 call blocks the thread and returns as soon as the other thread has released
   61 its ownership).
   62 
   63 2. For each publically available function in your library I created a second
   64 one with the same name but adding the extension "_mt" (multi threaded),
   65 which does the following:
   66 
   67 m_apm_xxx_mt(x,y,z);
   68 {
   69   obtain semaphore();
   70   m_apm_xxx(x,y,z);
   71   release semaphore();
   72 }
   73 
   74 In addition to that I created a C++ wrapper class MAPMMT, which does exactly
   75 the same as MAPM except it calls the new "_mt" functions to provide thread
   76 security.
   77 
   78 For example, use function 'm_apm_sqrt_mt' instead of 'm_apm_sqrt'.
   79 
   80 In order to use it you need to include m_apm_mt.h in your application.
   81 
   82 The file mapm_mt.c is a stand-alone module now and it should be linked
   83 in with your application. The compiled object file could also be added 
   84 to the library if the user desires.
   85 
   86 The beginning of file mapm_mt.c contains platform specific stuff (semaphore
   87 handling): Currently only code for MS Windows is available. Their meaning
   88 should be self explanatory. Code for other operating systems must be added.
   89 
   90 Before using any "_mt"-function the user now has to initialize the semaphore
   91 by calling m_apm_init_semaphore.
   92 
   93 After that the user of the library can decide whether to use the old
   94 functions or the secured functions, depending on the needs. The user can
   95 also call m_apm_enter(); to manually get ownership of the semaphore, call all
   96 the old functions (your original functions) and at the end call
   97 m_apm_leave(). So the overhead from constantly getting and releasing
   98 a semaphore tends to go near 0.
   99 
  100 I tested the speed of m_apm_enter() and m_apm_leave on my system: The
  101 result was that it can do about 30 000 000 m_apm_enter and m_apm_leave's
  102 per second (2 Ghz Athlon).
  103 
  104 That's about the speed of 3 floating point divisions, or in other words:
  105 overhead from that functions is near 0.
  106 
  107 Martin
  108