http://www.wiki.crossplatform.ru/index.php?title=ACE/FAQ/APG/ThreadManagement&feed=atom&action=history
ACE/FAQ/APG/ThreadManagement - История изменений
2024-03-29T05:50:54Z
История изменений этой страницы в вики
MediaWiki 1.15.1
http://www.wiki.crossplatform.ru/index.php?title=ACE/FAQ/APG/ThreadManagement&diff=9619&oldid=prev
ViGOur: Добавил ACE/FAQ/APG/ThreadManagement
2012-02-09T17:49:44Z
<p>Добавил ACE/FAQ/APG/ThreadManagement</p>
<p><b>Новая страница</b></p><div>__TOC__<br />
[[Категория:ACE FAQ]]<br />
<br />
== Async Cancel ==<br />
<source lang="cpp"><br />
// $Id: Async_Cancel.cpp 94362 2011-08-04 15:54:26Z mesnier_p $<br />
<br />
#include "ace/OS_NS_unistd.h"<br />
#include "ace/Task.h"<br />
#include "ace/Log_Msg.h"<br />
<br />
#if defined (ACE_HAS_PTHREADS) && !defined (ACE_LACKS_PTHREAD_CANCEL)<br />
// Only works on Pthreads...<br />
<br />
// Listing 1 code/ch13<br />
class CanceledTask : public ACE_Task<ACE_MT_SYNCH><br />
{<br />
public:<br />
virtual int svc (void)<br />
{<br />
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) Starting thread\n")));<br />
<br />
if (this->set_cancel_mode () < 0)<br />
return -1;<br />
<br />
while (1)<br />
{<br />
// Put this thread in a compute loop.. no<br />
// cancellation points are available.<br />
}<br />
}<br />
<br />
int set_cancel_mode (void)<br />
{<br />
cancel_state new_state;<br />
<br />
// Set the cancel state to asynchronous and enabled.<br />
new_state.cancelstate = PTHREAD_CANCEL_ENABLE;<br />
new_state.canceltype = PTHREAD_CANCEL_ASYNCHRONOUS;<br />
if (ACE_Thread::setcancelstate (new_state, 0) == -1)<br />
ACE_ERROR_RETURN ((LM_ERROR,<br />
ACE_TEXT ("%p\n"),<br />
ACE_TEXT ("cancelstate")), -1);<br />
return 0;<br />
}<br />
};<br />
// Listing 1<br />
// Listing 2 code/ch13<br />
int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
CanceledTask task;<br />
task.activate ();<br />
ACE_OS::sleep (1);<br />
ACE_Thread_Manager::instance ()->cancel_task (&task, 1);<br />
task.wait ();<br />
<br />
return 0;<br />
}<br />
// Listing 2<br />
<br />
#else /* ACE_HAS_PTHREADS */<br />
int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
ACE_OS::puts ("This example works on Pthreads platforms.\n");<br />
return 0;<br />
}<br />
#endif /* ACE_HAS_PTHREADS */<br />
</source><br />
<br />
== Coop Cancel ==<br />
<source lang="cpp"><br />
// $Id: Coop_Cancel.cpp 84565 2009-02-23 08:20:39Z johnnyw $<br />
<br />
#include "ace/config-lite.h"<br />
#if defined (ACE_HAS_THREADS)<br />
<br />
#include "ace/OS_NS_time.h"<br />
#include "ace/OS_NS_unistd.h"<br />
#include "ace/Task.h"<br />
#include "ace/Log_Msg.h"<br />
<br />
// Listing 1 code/ch13<br />
class CanceledTask : public ACE_Task<ACE_MT_SYNCH><br />
{<br />
public:<br />
<br />
virtual int svc (void)<br />
{<br />
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) starting up\n")));<br />
<br />
// Cache our ACE_Thread_Manager pointer.<br />
ACE_Thread_Manager *mgr = this->thr_mgr ();<br />
while (1)<br />
{<br />
if (mgr->testcancel (mgr->thr_self ()))<br />
return 0;<br />
<br />
ACE_Message_Block *mb = 0;<br />
ACE_Time_Value tv (0, 1000);<br />
tv += ACE_OS::time (0);<br />
int result = this->getq (mb, &tv);<br />
if (result == -1 && errno == EWOULDBLOCK)<br />
continue;<br />
else<br />
{<br />
// Do real work.<br />
}<br />
}<br />
<br />
ACE_NOTREACHED (return 0);<br />
}<br />
};<br />
// Listing 1<br />
<br />
// Listing 2 code/ch13<br />
int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
CanceledTask task;<br />
task.activate ();<br />
<br />
ACE_OS::sleep (1);<br />
<br />
ACE_Thread_Manager::instance ()->cancel_task (&task);<br />
task.wait ();<br />
return 0;<br />
}<br />
// Listing 2<br />
<br />
#else<br />
#include "ace/OS_main.h"<br />
#include "ace/OS_NS_stdio.h"<br />
<br />
int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
ACE_OS::puts (ACE_TEXT ("This example requires threads."));<br />
return 0;<br />
}<br />
<br />
#endif /* ACE_HAS_THREADS */<br />
</source><br />
<br />
== ExitHandler ==<br />
<source lang="cpp"><br />
// $Id: ExitHandler.cpp 84565 2009-02-23 08:20:39Z johnnyw $<br />
<br />
// Listing 1 code/ch13<br />
#include "ace/Task.h"<br />
#include "ace/Log_Msg.h"<br />
<br />
class ExitHandler : public ACE_At_Thread_Exit<br />
{<br />
public:<br />
virtual void apply (void)<br />
{<br />
ACE_DEBUG ((LM_INFO, ACE_TEXT ("(%t) is exiting\n")));<br />
<br />
// Shut down all devices.<br />
}<br />
};<br />
// Listing 1<br />
// Listing 2 code/ch13<br />
class HA_CommandHandler : public ACE_Task_Base<br />
{<br />
public:<br />
HA_CommandHandler(ExitHandler& eh) : eh_(eh)<br />
{ }<br />
<br />
virtual int svc (void)<br />
{<br />
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) starting up\n")));<br />
<br />
this->thr_mgr ()->at_exit (eh_);<br />
<br />
// Do something.<br />
<br />
// Forcefully exit.<br />
ACE_Thread::exit ();<br />
<br />
// NOT REACHED<br />
return 0;<br />
}<br />
<br />
private:<br />
ExitHandler& eh_;<br />
};<br />
// Listing 2<br />
// Listing 3 code/ch13<br />
int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
ExitHandler eh;<br />
<br />
HA_CommandHandler handler (eh);<br />
handler.activate ();<br />
<br />
ACE_Thread_Manager::instance ()->wait ();<br />
return 0;<br />
}<br />
// Listing 3<br />
#if 0<br />
// Listing 4 code/ch13<br />
int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
ExitHandler eh;<br />
ACE_Thread_Manager tm;<br />
<br />
HA_CommandHandler handler (eh);<br />
handler.thr_mgr (&tm);<br />
handler.activate ();<br />
<br />
tm.wait();<br />
return 0;<br />
}<br />
// Listing 4<br />
#endif<br />
</source><br />
<br />
== Pool ==<br />
<source lang="cpp"><br />
// $Id: Pool.cpp 91626 2010-09-07 10:59:20Z johnnyw $<br />
<br />
#include "ace/config-lite.h"<br />
#if defined (ACE_HAS_THREADS)<br />
<br />
#include "ace/Task.h"<br />
#include "ace/Log_Msg.h"<br />
<br />
// Listing 1 code/ch13<br />
class HA_CommandHandler : public ACE_Task<ACE_MT_SYNCH><br />
{<br />
public:<br />
virtual int svc (void)<br />
{<br />
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) starting up\n")));<br />
ACE_Message_Block *mb = 0;<br />
if (this->getq (mb) == -1)<br />
return -1;<br />
// ... do something with the message.<br />
return 0;<br />
}<br />
};<br />
// Listing 1<br />
// Listing 2 code/ch13<br />
int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
HA_CommandHandler handler;<br />
<br />
// Create 4 threads.<br />
handler.activate (THR_NEW_LWP | THR_JOINABLE, 4);<br />
handler.wait ();<br />
return 0;<br />
}<br />
// Listing 2<br />
<br />
#else<br />
#include "ace/OS_main.h"<br />
#include "ace/OS_NS_stdio.h"<br />
<br />
int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
ACE_OS::puts (ACE_TEXT ("This example requires threads."));<br />
return 0;<br />
}<br />
<br />
#endif /* ACE_HAS_THREADS */<br />
</source><br />
<br />
== Priorities ==<br />
<source lang="cpp"><br />
// $Id: Priorities.cpp 80826 2008-03-04 14:51:23Z wotte $<br />
<br />
#include "ace/config-lite.h"<br />
<br />
#if defined (ACE_HAS_THREADS)<br />
<br />
#include "ace/Task.h"<br />
#include "ace/Log_Msg.h"<br />
#include "ace/OS_NS_unistd.h"<br />
<br />
// Listing 2 code/ch13<br />
class HA_CommandHandler : public ACE_Task<ACE_MT_SYNCH><br />
{<br />
public:<br />
HA_CommandHandler (const char *name) : name_ (name)<br />
{ }<br />
<br />
virtual int svc (void)<br />
{<br />
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) starting up %C\n"),<br />
name_));<br />
<br />
ACE_OS::sleep (2);<br />
ACE_Message_Block *mb = 0;<br />
while (this->getq (mb) != -1)<br />
{<br />
if (mb->msg_type () == ACE_Message_Block::MB_BREAK)<br />
{<br />
mb->release ();<br />
break;<br />
}<br />
process_message (mb);<br />
mb->release ();<br />
}<br />
return 0;<br />
}<br />
<br />
void process_message (ACE_Message_Block *)<br />
{<br />
ACE_DEBUG ((LM_DEBUG,<br />
ACE_TEXT ("(%t) Processing message %C\n"),<br />
name_));<br />
// Simulate compute bound task.<br />
for (int i = 0; i < 100; i++)<br />
;<br />
}<br />
<br />
private:<br />
const char *name_;<br />
};<br />
// Listing 2<br />
<br />
#if !defined (ACE_THR_PRI_OTHER_MAX)<br />
// This should be fixed in ACE... There's no _MAX, _MIN values for<br />
// thread priorities.<br />
#if defined (ACE_WIN32)<br />
# define ACE_THR_PRI_OTHER_MAX ((ACE_THR_PRI_OTHER_DEF) + 1)<br />
#elif defined (VXWORKS)<br />
# define ACE_THR_PRI_OTHER_MAX 0<br />
#endif<br />
#endif<br />
<br />
// Listing 1 code/ch13<br />
int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
HA_CommandHandler hp_handler ("HighPriority");<br />
hp_handler.activate (THR_NEW_LWP | THR_JOINABLE,<br />
1, 1, ACE_THR_PRI_OTHER_MAX);<br />
<br />
HA_CommandHandler lp_handler ("LowPriority");<br />
lp_handler.activate (THR_NEW_LWP | THR_JOINABLE,<br />
1, 1, ACE_THR_PRI_OTHER_DEF);<br />
<br />
ACE_Message_Block mb;<br />
for (int i = 0; i < 100; i++)<br />
{<br />
ACE_Message_Block *mb_hp, *mb_lp;<br />
mb_hp = mb.clone ();<br />
mb_lp = mb.clone ();<br />
hp_handler.putq (mb_hp);<br />
lp_handler.putq (mb_lp);<br />
}<br />
<br />
ACE_Message_Block stop (0, ACE_Message_Block::MB_BREAK);<br />
hp_handler.putq (stop.clone ());<br />
lp_handler.putq (stop.clone ());<br />
hp_handler.wait ();<br />
lp_handler.wait ();<br />
<br />
return 0;<br />
}<br />
// Listing 1<br />
<br />
#else<br />
#include "ace/OS_main.h"<br />
#include "ace/OS_NS_stdio.h"<br />
<br />
int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
ACE_OS::puts (ACE_TEXT ("This example requires threads."));<br />
return 0;<br />
}<br />
<br />
#endif /* ACE_HAS_THREADS */<br />
</source><br />
<br />
== SecurityContext.h ==<br />
<source lang="cpp"><br />
/**<br />
* $Id: SecurityContext.h 80826 2008-03-04 14:51:23Z wotte $<br />
*<br />
* Sample code from The ACE Programmer's Guide,<br />
* copyright 2003 Addison-Wesley. All Rights Reserved.<br />
*/<br />
<br />
#ifndef __SECURITYCONTEXT_H_<br />
#define __SECURITYCONTEXT_H_<br />
<br />
struct SecurityContext<br />
{<br />
const char * user;<br />
};<br />
<br />
#endif /* __SECURITYCONTEXT_H_ */<br />
</source><br />
<br />
== Signals ==<br />
<source lang="cpp"><br />
// $Id: Signals.cpp 80826 2008-03-04 14:51:23Z wotte $<br />
<br />
#include "ace/config-lite.h"<br />
#if defined (ACE_HAS_THREADS)<br />
<br />
#include "ace/OS_NS_time.h"<br />
#include "ace/OS_NS_unistd.h"<br />
#include "ace/Task.h"<br />
#include "ace/Log_Msg.h"<br />
#include "ace/Signal.h"<br />
#include "ace/Sig_Handler.h"<br />
<br />
// Listing 1 code/ch13<br />
class SignalableTask : public ACE_Task<ACE_MT_SYNCH><br />
{<br />
public:<br />
virtual int handle_signal (int signum,<br />
siginfo_t * = 0,<br />
ucontext_t * = 0)<br />
{<br />
if (signum == SIGUSR1)<br />
{<br />
ACE_DEBUG ((LM_DEBUG,<br />
ACE_TEXT ("(%t) received a %S signal\n"),<br />
signum));<br />
handle_alert ();<br />
}<br />
return 0;<br />
}<br />
<br />
virtual int svc (void)<br />
{<br />
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) Starting thread\n")));<br />
<br />
while (1)<br />
{<br />
ACE_Message_Block* mb = 0;<br />
ACE_Time_Value tv (0, 1000);<br />
tv += ACE_OS::time (0);<br />
int result = this->getq (mb, &tv);<br />
if (result == -1 && errno == EWOULDBLOCK)<br />
continue;<br />
else<br />
process_message (mb);<br />
}<br />
<br />
ACE_NOTREACHED (return 0);<br />
}<br />
<br />
void handle_alert ();<br />
void process_message (ACE_Message_Block *mb);<br />
};<br />
// Listing 1<br />
<br />
void<br />
SignalableTask::process_message (ACE_Message_Block *)<br />
{<br />
}<br />
<br />
void<br />
SignalableTask::handle_alert ()<br />
{<br />
}<br />
<br />
// Listing 2 code/ch13<br />
int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
SignalableTask handler;<br />
handler.activate (THR_NEW_LWP | THR_JOINABLE , 5);<br />
<br />
ACE_Sig_Handler sh;<br />
sh.register_handler (SIGUSR1, &handler);<br />
<br />
ACE_OS::sleep (1);<br />
<br />
ACE_Thread_Manager::instance () -><br />
kill_grp (handler.grp_id (), SIGUSR1);<br />
handler.wait ();<br />
return 0;<br />
}<br />
// Listing 2<br />
<br />
#else<br />
#include "ace/OS_main.h"<br />
#include "ace/OS_NS_stdio.h"<br />
<br />
int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
ACE_OS::puts (ACE_TEXT ("This example requires threads."));<br />
return 0;<br />
}<br />
<br />
#endif /* ACE_HAS_THREADS */<br />
</source><br />
<br />
== Signals2 ==<br />
<source lang="cpp"><br />
// $Id: Signals2.cpp 84565 2009-02-23 08:20:39Z johnnyw $<br />
<br />
#include "ace/config-lite.h"<br />
#if defined (ACE_HAS_THREADS)<br />
<br />
#include "ace/OS_NS_time.h"<br />
#include "ace/OS_NS_unistd.h"<br />
#include "ace/Task.h"<br />
#include "ace/Log_Msg.h"<br />
#include "ace/Signal.h"<br />
#include "ace/Sig_Handler.h"<br />
<br />
class SignalableTask : public ACE_Task<ACE_MT_SYNCH><br />
{<br />
public:<br />
virtual int handle_signal (int signum,<br />
siginfo_t * = 0,<br />
ucontext_t * = 0)<br />
{<br />
if (signum == SIGUSR1)<br />
{<br />
ACE_DEBUG ((LM_DEBUG,<br />
ACE_TEXT ("(%t) received a %S signal\n"),<br />
signum));<br />
handle_alert();<br />
}<br />
<br />
return 0;<br />
}<br />
<br />
virtual int svc (void)<br />
{<br />
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) Starting thread\n")));<br />
<br />
while (1)<br />
{<br />
ACE_Message_Block* mb = 0;<br />
ACE_Time_Value tv (0, 1000);<br />
tv += ACE_OS::time (0);<br />
<br />
int result = this->getq(mb, &tv);<br />
<br />
if (result == -1 && errno == EWOULDBLOCK)<br />
continue;<br />
else<br />
process_message (mb);<br />
}<br />
<br />
ACE_NOTREACHED (return 0);<br />
}<br />
<br />
void handle_alert ();<br />
void process_message (ACE_Message_Block *mb);<br />
};<br />
<br />
void<br />
SignalableTask::process_message (ACE_Message_Block *)<br />
{<br />
return;<br />
}<br />
<br />
void<br />
SignalableTask::handle_alert (void)<br />
{<br />
return;<br />
}<br />
<br />
// Listing 1 code/ch13<br />
int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) Main thread\n")));<br />
SignalableTask handler;<br />
handler.activate (THR_NEW_LWP | THR_JOINABLE, 5);<br />
<br />
ACE_Sig_Handler sh;<br />
sh.register_handler (SIGUSR1, &handler);<br />
<br />
ACE_OS::sleep (1); // Allow threads to start<br />
<br />
for (int i = 0; i < 5; i++)<br />
ACE_OS::kill (ACE_OS::getpid (), SIGUSR1);<br />
handler.wait ();<br />
return 0;<br />
}<br />
// Listing 1<br />
<br />
#else<br />
#include "ace/OS_main.h"<br />
#include "ace/OS_NS_stdio.h"<br />
<br />
int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
ACE_OS::puts (ACE_TEXT ("This example requires threads."));<br />
return 0;<br />
}<br />
<br />
#endif /* ACE_HAS_THREADS */<br />
</source><br />
<br />
== Start Hook ==<br />
<source lang="cpp"><br />
// $Id: Start_Hook.cpp 84565 2009-02-23 08:20:39Z johnnyw $<br />
<br />
#include "ace/Thread_Hook.h"<br />
#include "ace/Task.h"<br />
#include "ace/Log_Msg.h"<br />
<br />
#include "SecurityContext.h"<br />
<br />
// Listing 1 code/ch13<br />
class HA_ThreadHook : public ACE_Thread_Hook<br />
{<br />
public:<br />
virtual ACE_THR_FUNC_RETURN start (ACE_THR_FUNC func, void* arg)<br />
{<br />
ACE_DEBUG ((LM_DEBUG, ACE_TEXT("(%t) New Thread Spawned\n")));<br />
<br />
// Create the context on the thread's own stack.<br />
ACE_TSS<SecurityContext> secCtx;<br />
// Special initialization.<br />
add_sec_context_thr (secCtx);<br />
<br />
return (*func) (arg);<br />
}<br />
<br />
void add_sec_context_thr (ACE_TSS<SecurityContext> &secCtx);<br />
};<br />
// Listing 1<br />
<br />
void<br />
HA_ThreadHook::add_sec_context_thr(ACE_TSS<SecurityContext> &secCtx)<br />
{<br />
secCtx->user = 0;<br />
}<br />
<br />
<br />
class HA_CommandHandler : public ACE_Task_Base<br />
{<br />
public:<br />
virtual int svc (void)<br />
{<br />
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) starting up\n")));<br />
<br />
// Do something.<br />
<br />
return 0;<br />
}<br />
};<br />
// Listing 2 code/ch13<br />
int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
HA_ThreadHook hook;<br />
ACE_Thread_Hook::thread_hook (&hook);<br />
<br />
HA_CommandHandler handler;<br />
handler.activate ();<br />
handler.wait();<br />
return 0;<br />
}<br />
// Listing 2<br />
</source><br />
<br />
== State ==<br />
<source lang="cpp"><br />
// $Id: State.cpp 91813 2010-09-17 07:52:52Z johnnyw $<br />
<br />
#include "ace/Task.h"<br />
<br />
class HA_CommandHandler : public ACE_Task_Base<br />
{<br />
public:<br />
virtual int svc (void)<br />
{<br />
ACE_DEBUG<br />
((LM_DEBUG, ACE_TEXT ("(%t) Handler Thread running\n")));<br />
return 0;<br />
}<br />
};<br />
<br />
<br />
int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) Main Thread running\n")));<br />
// Listing 1 code/ch13<br />
HA_CommandHandler handler;<br />
int result = handler.activate (THR_NEW_LWP |<br />
THR_JOINABLE |<br />
THR_SUSPENDED);<br />
ACE_ASSERT (result == 0);<br />
<br />
ACE_UNUSED_ARG (result);<br />
<br />
ACE_DEBUG ((LM_DEBUG,<br />
ACE_TEXT ("(%t) The current thread count is %d\n"),<br />
handler.thr_count ()));<br />
ACE_DEBUG ((LM_DEBUG,<br />
ACE_TEXT ("(%t) The group identifier is %d\n"),<br />
handler.grp_id ()));<br />
handler.resume ();<br />
handler.wait ();<br />
// Listing 1<br />
return 0;<br />
}<br />
</source></div>
ViGOur