Click here to Skip to main content
15,886,799 members
Articles / Programming Languages / C++

Cross thread calls in native C++

Rate me:
Please Sign up or sign in to vote.
4.85/5 (38 votes)
19 Jul 2007Apache20 min read 117.6K   1.2K   96  
An article which discusses the need for synchronization in multi-threaded applications, and features a generic framework for making calls across threads: ThreadSynch.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>ThreadSynch: Class Members - Functions</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.1-p1 -->
<div class="tabs">
  <ul>
    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
    <li><a href="files.html"><span>Files</span></a></li>
  </ul></div>
<div class="tabs">
  <ul>
    <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
    <li id="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
  </ul></div>
<div class="tabs">
  <ul>
    <li><a href="functions.html"><span>All</span></a></li>
    <li id="current"><a href="functions_func.html"><span>Functions</span></a></li>
    <li><a href="functions_vars.html"><span>Variables</span></a></li>
    <li><a href="functions_type.html"><span>Typedefs</span></a></li>
  </ul>
</div>
<div class="tabs">
  <ul>
    <li><a href="#index_a"><span>a</span></a></li>
    <li><a href="#index_b"><span>b</span></a></li>
    <li><a href="#index_c"><span>c</span></a></li>
    <li><a href="#index_d"><span>d</span></a></li>
    <li><a href="#index_e"><span>e</span></a></li>
    <li><a href="#index_f"><span>f</span></a></li>
    <li><a href="#index_g"><span>g</span></a></li>
    <li><a href="#index_i"><span>i</span></a></li>
    <li><a href="#index_j"><span>j</span></a></li>
    <li><a href="#index_l"><span>l</span></a></li>
    <li><a href="#index_o"><span>o</span></a></li>
    <li><a href="#index_p"><span>p</span></a></li>
    <li><a href="#index_r"><span>r</span></a></li>
    <li><a href="#index_s"><span>s</span></a></li>
    <li><a href="#index_t"><span>t</span></a></li>
    <li><a href="#index_u"><span>u</span></a></li>
    <li><a href="#index_w"><span>w</span></a></li>
    <li><a href="#index_~"><span>~</span></a></li>
  </ul>
</div>

<p>
&nbsp;
<p>
<h3><a class="anchor" name="index_a">- a -</a></h3><ul>
<li>APCCallback()
: <a class="el" href="class_async_caller.html#f44e0675be3e4dccaf7b10ca414ace2a">AsyncCaller</a>
<li>AsyncCaller()
: <a class="el" href="class_async_caller.html#e4ab3960e98178b7605dac44196818a9">AsyncCaller</a>
</ul>
<h3><a class="anchor" name="index_b">- b -</a></h3><ul>
<li>BOOST_PP_REPEAT_2ND()
: <a class="el" href="class_exception_expecter_3_01_e_00_01_b_o_o_s_t___p_p___i_t_e_r_a_t_i_o_n()_4.html#8344e702c16a56271d550db49f4d4b9f">ExceptionExpecter&lt; E, BOOST_PP_ITERATION()&gt;</a>
</ul>
<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
<li>CallbackInfo()
: <a class="el" href="class_callback_info.html#567d581fd6b0dbffbc9f7970546fb9e1">CallbackInfo</a>
<li>CallHandler()
: <a class="el" href="class_thread_synch_1_1_call_handler.html#00596b487225875df620860225cbdaff">ThreadSynch::CallHandler</a>
<li>CallScheduler()
: <a class="el" href="class_thread_synch_1_1_call_scheduler.html#0715f4fa0b068a6e1c34777b35e2936c">ThreadSynch::CallScheduler&lt; PickupPolicy &gt;</a>
<li>CallSchedulingFailedException()
: <a class="el" href="class_thread_synch_1_1_call_scheduling_failed_exception.html#21c87b7603b110f4d4a6525d27e970b5">ThreadSynch::CallSchedulingFailedException</a>
<li>CallTimeoutException()
: <a class="el" href="class_thread_synch_1_1_call_timeout_exception.html#afbcc3c79fc51b5ec8597a0d4f50973c">ThreadSynch::CallTimeoutException</a>
<li>caughtException()
: <a class="el" href="class_thread_synch_1_1_call_handler.html#503f40467d67c5e66d75d7e4adc982f2">ThreadSynch::CallHandler</a>
<li>CriticalSection()
: <a class="el" href="class_critical_section.html#7749425577cdeee2d32815e63d96e9ff">CriticalSection</a>
</ul>
<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
<li>dequeueThreadCall()
: <a class="el" href="class_thread_synch_1_1_call_scheduler.html#e503502d552191ef90a3b0c3dfe53db6">ThreadSynch::CallScheduler&lt; PickupPolicy &gt;</a>
</ul>
<h3><a class="anchor" name="index_e">- e -</a></h3><ul>
<li>enqueueThreadCall()
: <a class="el" href="class_thread_synch_1_1_call_scheduler.html#582a080efb6f92ca0532eb7eec820dfb">ThreadSynch::CallScheduler&lt; PickupPolicy &gt;</a>
<li>enter()
: <a class="el" href="class_critical_section.html#a75ef9d5c1667e290a433ba34dc23844">CriticalSection</a>
<li>ExceptionExpecter()
: <a class="el" href="class_exception_expecter_3_01_e_00_01_b_o_o_s_t___p_p___i_t_e_r_a_t_i_o_n()_4.html#937fd96f92730d74258e35978f0325de">ExceptionExpecter&lt; E, BOOST_PP_ITERATION()&gt;</a>
<li>execute()
: <a class="el" href="class_thread_synch_1_1_functor_retval_binder.html#67c8d4881051b8a8e014383d97018b7b">ThreadSynch::FunctorRetvalBinder&lt; T &gt;</a>
, <a class="el" href="class_callback_info_1_1_functor_saver.html#d602e0cb4ac957658fc4852138564055">CallbackInfo::FunctorSaver&lt; T &gt;</a>
<li>executeCallback()
: <a class="el" href="class_thread_synch_1_1_call_handler.html#f956917892782e2e93770f0ce949b930">ThreadSynch::CallHandler</a>
, <a class="el" href="class_callback_info.html#46af96941eea83dfe7bd728c8a1a6f23">CallbackInfo</a>
, <a class="el" href="class_thread_synch_1_1_w_m_pickup_policy.html#69c25001f589484275d23dcf0416be25">ThreadSynch::WMPickupPolicy&lt; WindowMessageId &gt;</a>
<li>executeCallHandler()
: <a class="el" href="class_thread_synch_1_1_call_scheduler.html#3f0fe348a2fb08df5f5a0d1d28522265">ThreadSynch::CallScheduler&lt; PickupPolicy &gt;</a>
<li>executeScheduledCalls()
: <a class="el" href="class_thread_synch_1_1_call_scheduler.html#3bf23335dbab7475823385cfb7e868cb">ThreadSynch::CallScheduler&lt; PickupPolicy &gt;</a>
</ul>
<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
<li>free()
: <a class="el" href="class_callback_info_1_1_functor_saver.html#a59b778d4f4dfae65cd92f7aee8390c4">CallbackInfo::FunctorSaver&lt; T &gt;</a>
, <a class="el" href="class_thread_synch_1_1_functor_retval_binder.html#c91156994eab285f656173e7002ed16c">ThreadSynch::FunctorRetvalBinder&lt; T &gt;</a>
, <a class="el" href="class_exception_expecter_3_01_e_00_01_b_o_o_s_t___p_p___i_t_e_r_a_t_i_o_n()_4.html#25d7ef75b058b698cc1e1c9c2040c781">ExceptionExpecter&lt; E, BOOST_PP_ITERATION()&gt;</a>
<li>FunctorRetvalBinder()
: <a class="el" href="class_thread_synch_1_1_functor_retval_binder.html#326fc1db141fd6e48cbda43416fa27cb">ThreadSynch::FunctorRetvalBinder&lt; T &gt;</a>
<li>FunctorSaver()
: <a class="el" href="class_callback_info_1_1_functor_saver.html#fd3fbf67dac86f8343c61223ec4151a1">CallbackInfo::FunctorSaver&lt; T &gt;</a>
</ul>
<h3><a class="anchor" name="index_g">- g -</a></h3><ul>
<li>getAccessMutex()
: <a class="el" href="class_thread_synch_1_1_call_handler.html#fba6f20d909a441bf26f398acb08d00d">ThreadSynch::CallHandler</a>
<li>getInstance()
: <a class="el" href="class_async_caller.html#50d891b4b27f59fade463127276a188f">AsyncCaller</a>
, <a class="el" href="class_thread_synch_1_1_call_scheduler.html#337fe8bd1fccbe30b610c5eb094a2ae4">ThreadSynch::CallScheduler&lt; PickupPolicy &gt;</a>
<li>getNextCallFromQueue()
: <a class="el" href="class_thread_synch_1_1_call_scheduler.html#13aed07b2a53acffb3448bd014d3a348">ThreadSynch::CallScheduler&lt; PickupPolicy &gt;</a>
<li>getReturnValue()
: <a class="el" href="class_callback_info.html#fd52d5af90e644966558876f28da0dfc">CallbackInfo</a>
, <a class="el" href="class_thread_synch_1_1_call_handler.html#a2d19cdb118b95b47c1e0c721543165b">ThreadSynch::CallHandler</a>
<li>getThreadHandle()
: <a class="el" href="class_thread_base.html#a888dfafc51d4a99b444b3ddce47ac6b">ThreadBase</a>
<li>getThreadId()
: <a class="el" href="class_thread_base.html#704ed50fa6eaf27ece569d261402a0b2">ThreadBase</a>
</ul>
<h3><a class="anchor" name="index_i">- i -</a></h3><ul>
<li>isCompleted()
: <a class="el" href="class_callback_info.html#444d43bf06e70cf94f760dcf488000d3">CallbackInfo</a>
, <a class="el" href="class_thread_synch_1_1_call_handler.html#783d9b823407890a9db6204dbe8c0547">ThreadSynch::CallHandler</a>
</ul>
<h3><a class="anchor" name="index_j">- j -</a></h3><ul>
<li>join()
: <a class="el" href="class_thread_base.html#16b867e1f533c162e01dc8c0ae080f6f">ThreadBase</a>
</ul>
<h3><a class="anchor" name="index_l">- l -</a></h3><ul>
<li>leave()
: <a class="el" href="class_critical_section.html#9fc86b2c948da45d66c46496b9b11a0f">CriticalSection</a>
</ul>
<h3><a class="anchor" name="index_o">- o -</a></h3><ul>
<li>onExceptionExpecterComplete()
: <a class="el" href="class_thread_synch_1_1_call_handler.html#0d085c7496eb484faf759febc3a2cb30">ThreadSynch::CallHandler</a>
<li>onRethrownExceptionDestroyed()
: <a class="el" href="class_thread_synch_1_1_call_scheduler.html#49c20888be3dda00adb2fa3620fac7fd">ThreadSynch::CallScheduler&lt; PickupPolicy &gt;</a>
<li>operator=()
: <a class="el" href="class_thread_synch_1_1_call_scheduler.html#381d57f81f2a80fd7cdc706c296a1ee6">ThreadSynch::CallScheduler&lt; PickupPolicy &gt;</a>
, <a class="el" href="class_async_caller.html#67590e47a82ff258bfd9dafb71de0ca3">AsyncCaller</a>
</ul>
<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
<li>PickupPolicyProvider()
: <a class="el" href="class_thread_synch_1_1_pickup_policy_provider.html#8adf7585f9c6b41cebf836b04624188b">ThreadSynch::PickupPolicyProvider</a>
<li>PickupSchedulingFailedException()
: <a class="el" href="class_thread_synch_1_1_pickup_scheduling_failed_exception.html#558c222aba7624c51b4538ae39b9b3c4">ThreadSynch::PickupSchedulingFailedException</a>
</ul>
<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
<li>rethrow()
: <a class="el" href="class_exception_expecter_3_01_e_00_01_b_o_o_s_t___p_p___i_t_e_r_a_t_i_o_n()_4.html#6ee3cb197b509a3776cf9da2a2c76c7f">ExceptionExpecter&lt; E, BOOST_PP_ITERATION()&gt;</a>
<li>rethrowException()
: <a class="el" href="class_thread_synch_1_1_call_handler.html#b82c52296707e77be495b73d9dfb840d">ThreadSynch::CallHandler</a>
<li>run()
: <a class="el" href="class_thread_base.html#c1510077e51c0fda40402b4557863552">ThreadBase</a>
</ul>
<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
<li>scheduleThreadCallback()
: <a class="el" href="class_thread_synch_1_1_a_p_c_pickup_policy.html#a5b6c8d230a7ef7ea69c7b6a51ae3289">ThreadSynch::APCPickupPolicy</a>
, <a class="el" href="class_thread_synch_1_1_pickup_policy_provider.html#d57675412b094616d74060cb8e2dbad5">ThreadSynch::PickupPolicyProvider</a>
, <a class="el" href="class_thread_synch_1_1_w_m_pickup_policy.html#93ef619297aa14ca4d3971cac3ac3ad4">ThreadSynch::WMPickupPolicy&lt; WindowMessageId &gt;</a>
<li>setCallback()
: <a class="el" href="class_callback_info.html#6b739a205b26edf862e26a6eb0e9ee06">CallbackInfo</a>
<li>setCallFunctor()
: <a class="el" href="class_thread_synch_1_1_call_handler.html#828f3f6b9d0ff47e8c79aba7b2934de9">ThreadSynch::CallHandler</a>
<li>start()
: <a class="el" href="class_thread_base.html#d3d2d11000b0513b0d5b01d394c3f7cd">ThreadBase</a>
<li>startThread()
: <a class="el" href="class_thread_base.html#7ec0414b71163ab3def27b8ce5a145ad">ThreadBase</a>
<li>syncCall()
: <a class="el" href="class_thread_synch_1_1_call_scheduler.html#989f3e0d31bed40bfcb9bebc21e76011">ThreadSynch::CallScheduler&lt; PickupPolicy &gt;</a>
, <a class="el" href="class_async_caller.html#122481379f859397e7005a18eb9de0cb">AsyncCaller</a>
, <a class="el" href="class_thread_synch_1_1_call_scheduler.html#fcd34e956d15bb1d6d98ed8555c15dff">ThreadSynch::CallScheduler&lt; PickupPolicy &gt;</a>
</ul>
<h3><a class="anchor" name="index_t">- t -</a></h3><ul>
<li>throwExUnexpected()
: <a class="el" href="class_exception_expecter_3_01_e_00_01_b_o_o_s_t___p_p___i_t_e_r_a_t_i_o_n()_4.html#8e196738b67d6243bb125990d5784fdb">ExceptionExpecter&lt; E, BOOST_PP_ITERATION()&gt;</a>
</ul>
<h3><a class="anchor" name="index_u">- u -</a></h3><ul>
<li>UnexpectedException()
: <a class="el" href="class_thread_synch_1_1_unexpected_exception.html#98601b3ba5bc4a26ee92713e386744ee">ThreadSynch::UnexpectedException</a>
</ul>
<h3><a class="anchor" name="index_w">- w -</a></h3><ul>
<li>waitForCompletion()
: <a class="el" href="class_callback_info.html#46924e7becb22d08e69a0957699d756a">CallbackInfo</a>
, <a class="el" href="class_thread_synch_1_1_call_handler.html#44b5abe6a6f02e16d2a4d937ed2edc9d">ThreadSynch::CallHandler</a>
</ul>
<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
<li>~CallbackInfo()
: <a class="el" href="class_callback_info.html#3b4176446f49da0c24fd42c657df763e">CallbackInfo</a>
<li>~CallHandler()
: <a class="el" href="class_thread_synch_1_1_call_handler.html#babec161e856179c27dd9f4876ba64d2">ThreadSynch::CallHandler</a>
<li>~CriticalSection()
: <a class="el" href="class_critical_section.html#8f10b99e9550811be81a0ca409171bcc">CriticalSection</a>
<li>~ExceptionExpecter()
: <a class="el" href="class_exception_expecter_3_01_e_00_01_b_o_o_s_t___p_p___i_t_e_r_a_t_i_o_n()_4.html#afb6f0922388eb72939bc6c78b755efb">ExceptionExpecter&lt; E, BOOST_PP_ITERATION()&gt;</a>
<li>~FunctorRetvalBinder()
: <a class="el" href="class_thread_synch_1_1_functor_retval_binder.html#fba706ba0110a7029f474587ef2281d4">ThreadSynch::FunctorRetvalBinder&lt; T &gt;</a>
</ul>
<hr size="1"><address style="align: right;"><small>Generated on Tue Mar 13 23:06:20 2007 for ThreadSynch by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1-p1 </small></address>
</body>
</html>

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Apache License, Version 2.0


Written By
Software Developer
Norway Norway
My name is Einar Otto Stangvik, and I'm a programmer based in Oslo, Norway. I mainly develop applications and software architectures targetting C++ on the Windows platform, but I have also got experience doing the same on Unix and Linux. The last few years I've used C# a lot, but native C++ is still my main focus.


As of July 2008, I'm a Microsoft MVP for Visual C++.


Follow me on Twitter: @einaros
My code blog: einaros.blogspot.com
My site: www.indev.no

Comments and Discussions