Титульная страница | Пространства имен | Алфавитный указатель | Классы | Файлы | Члены пространства имен | Члены классов | Описания | Примеры

sample/cond_var/main.cpp

/* threads_1: Multithreading support library Yauheni A. Akhotnikau (C) 2002-2003 eao197@yahoo.com ------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. ------------------------------------------------- */ /* Демострация работы condition variable. */ #include <iostream> #include <cpp_util_2/h/defs.hpp> #include <threads_1/h/threads.hpp> /* Класс нити, которая ожидает наступление события (срабатывания condition variable), печатает на экран сообщение и завершается. */ class my_thread_t : public threads_1::thread_t { private : // Семафор, который необходим // для ожидания condition variable. const threads_1::mutex_sem_t & m_sem; // Condition variable, срабатывание // которой ожидается нитью. const threads_1::cond_var_t & m_cv; public : my_thread_t( const threads_1::mutex_sem_t & sem, const threads_1::cond_var_t & cv ); virtual ~my_thread_t(); protected : // Данный метод выполняет все действия нити. virtual void body(); }; my_thread_t::my_thread_t( const threads_1::mutex_sem_t & sem, const threads_1::cond_var_t & cv ) : m_sem( sem ), m_cv( cv ) { } my_thread_t::~my_thread_t() { } void my_thread_t::body() { std::cout << "Thread started\n" << std::flush; { // Захватываем mutex. threads_1::mutex_sem_t::lock_t lock( m_sem ); // Ожидаем срабатывания condition variable. m_cv.wait(); // Condition variable сработала. // Если бы здесь выполнялись какие-то // операции над разделяемыми данными, то // этому бы никто не мешал, т.к. данная // нить владеет m_sem. std::cout << "Condition variable signaled\n" << std::flush; } std::cout << "Thread finished\n" << std::flush; } int main() { threads_1::mutex_sem_t sem; threads_1::cond_var_t cv( sem ); // Поскольку нет нитей, которые бы ожидали // condition variable, то на это срабатывание // никто не среагирует. { // Важно перед нотификацией захватить семафор! threads_1::mutex_sem_t::lock_t lock( sem ); cv.notify_one(); } // Запускаем нити. my_thread_t t1( sem, cv ); my_thread_t t2( sem, cv ); my_thread_t t3( sem, cv ); t1.start(); t2.start(); t3.start(); // Для того, чтобы все нити вошли в режим ожидания // обеспечиваем задержку. threads_1::sleep_thread( 1000 ); // Разбудим только одну нить. { threads_1::mutex_sem_t::lock_t lock( sem ); cv.notify_one(); } // Даем время одной нити на завершения и будим // остальные нити. threads_1::sleep_thread( 1000 ); { threads_1::mutex_sem_t::lock_t lock( sem ); cv.notify_all(); } // Ожидаем завершения работы всех нитей. t1.wait(); t2.wait(); t3.wait(); return 0; }
00001 /* 00002 00003 threads_1: Multithreading support library 00004 Yauheni A. Akhotnikau (C) 2002-2003 00005 eao197@yahoo.com 00006 ------------------------------------------------- 00007 00008 Permission is granted to anyone to use this software for any purpose on any 00009 computer system, and to redistribute it freely, subject to the following 00010 restrictions: 00011 00012 1. This software is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00015 00016 2. The origin of this software must not be misrepresented, either by 00017 explicit claim or by omission. 00018 00019 3. Altered versions must be plainly marked as such, and must not be 00020 misrepresented as being the original software. 00021 00022 ------------------------------------------------- 00023 00024 */ 00025 /* 00026 Демострация работы condition variable. 00027 */ 00028 00029 #include <iostream> 00030 00031 #include <cpp_util_2/h/defs.hpp> 00032 00033 #include <threads_1/h/threads.hpp> 00034 00035 /* 00036 Класс нити, которая ожидает наступление 00037 события (срабатывания condition variable), 00038 печатает на экран сообщение и завершается. 00039 */ 00040 class my_thread_t : 00041 public threads_1::thread_t 00042 { 00043 private : 00044 // Семафор, который необходим 00045 // для ожидания condition variable. 00046 const threads_1::mutex_sem_t & m_sem; 00047 00048 // Condition variable, срабатывание 00049 // которой ожидается нитью. 00050 const threads_1::cond_var_t & m_cv; 00051 public : 00052 my_thread_t( 00053 const threads_1::mutex_sem_t & sem, 00054 const threads_1::cond_var_t & cv ); 00055 virtual ~my_thread_t(); 00056 00057 protected : 00058 // Данный метод выполняет все действия нити. 00059 virtual void 00060 body(); 00061 }; 00062 00063 my_thread_t::my_thread_t( 00064 const threads_1::mutex_sem_t & sem, 00065 const threads_1::cond_var_t & cv ) 00066 : 00067 m_sem( sem ), 00068 m_cv( cv ) 00069 { 00070 } 00071 00072 my_thread_t::~my_thread_t() 00073 { 00074 } 00075 00076 void 00077 my_thread_t::body() 00078 { 00079 std::cout << "Thread started\n" << std::flush; 00080 00081 { 00082 // Захватываем mutex. 00083 threads_1::mutex_sem_t::lock_t lock( m_sem ); 00084 00085 // Ожидаем срабатывания condition variable. 00086 m_cv.wait(); 00087 00088 // Condition variable сработала. 00089 // Если бы здесь выполнялись какие-то 00090 // операции над разделяемыми данными, то 00091 // этому бы никто не мешал, т.к. данная 00092 // нить владеет m_sem. 00093 std::cout << "Condition variable signaled\n" 00094 << std::flush; 00095 } 00096 00097 std::cout << "Thread finished\n" << std::flush; 00098 } 00099 00100 int 00101 main() 00102 { 00103 threads_1::mutex_sem_t sem; 00104 threads_1::cond_var_t cv( sem ); 00105 00106 // Поскольку нет нитей, которые бы ожидали 00107 // condition variable, то на это срабатывание 00108 // никто не среагирует. 00109 { 00110 // Важно перед нотификацией захватить семафор! 00111 threads_1::mutex_sem_t::lock_t lock( sem ); 00112 cv.notify_one(); 00113 } 00114 00115 // Запускаем нити. 00116 my_thread_t t1( sem, cv ); 00117 my_thread_t t2( sem, cv ); 00118 my_thread_t t3( sem, cv ); 00119 00120 t1.start(); 00121 t2.start(); 00122 t3.start(); 00123 00124 // Для того, чтобы все нити вошли в режим ожидания 00125 // обеспечиваем задержку. 00126 threads_1::sleep_thread( 1000 ); 00127 00128 // Разбудим только одну нить. 00129 { 00130 threads_1::mutex_sem_t::lock_t lock( sem ); 00131 cv.notify_one(); 00132 } 00133 00134 // Даем время одной нити на завершения и будим 00135 // остальные нити. 00136 threads_1::sleep_thread( 1000 ); 00137 { 00138 threads_1::mutex_sem_t::lock_t lock( sem ); 00139 cv.notify_all(); 00140 } 00141 00142 // Ожидаем завершения работы всех нитей. 00143 t1.wait(); 00144 t2.wait(); 00145 t3.wait(); 00146 00147 return 0; 00148 }

Документация по threads_1. Последние изменения: Wed Aug 4 06:46:00 2004. Создано системой doxygen 1.3.7
Hosted by uCoz