📄 thread_8h-source.html
字号:
00183 <span class="preprocessor">#endif</span>00184 <span class="preprocessor"></span> <span class="keywordflow">if</span> (r != 0) {00185 <a class="code" href="utils_8h.html#a1">FAILSTOP</a>(); <span class="comment">// trap "can't unlock" errors</span>00186 <span class="comment">// if (con) </span>00187 <span class="comment">// con->xprintf(5, "ERROR: MUTEX %i UNLOCK == %i\n", m, r);</span>00188 }00189 <span class="comment">//if (con) con->dprintf("MUTEX %i unlocked (%i)\n", m, r);</span>00190 <span class="keywordflow">return</span> (r == 0);00191 }00192 <span class="keywordflow">else</span> {00193 count_unlock(); <span class="comment">// do nothing, still more unlocks to go.</span>00194 <span class="keywordflow">return</span> <span class="keyword">true</span>;00195 }00196 }00197 }00198 00200 <span class="keyword">virtual</span> ~mutex_c() {00201 <span class="keywordtype">int</span> r;00202 <span class="preprocessor">#ifdef USE_HAWKTHREADS</span>00203 <span class="preprocessor"></span> r = htMutexDestroy(&m);00204 assert(r == 0);00205 r = htMutexDestroy(&c);00206 assert(r == 0);00207 <span class="preprocessor">#else</span>00208 <span class="preprocessor"></span> r = pthread_mutex_destroy(&m);00209 assert(r == 0);00210 r = pthread_mutex_destroy(&c);00211 assert(r == 0);00212 <span class="preprocessor">#endif</span>00213 <span class="preprocessor"></span> }00214 00215 <span class="keyword">protected</span>:00216 00217 <span class="preprocessor">#ifdef USE_HAWKTHREADS</span>00218 <span class="preprocessor"></span> <span class="keywordtype">void</span> count_lock() { <span class="keywordtype">int</span> r = htMutexLock(&c); <span class="keywordflow">if</span> (r != 0) <a class="code" href="utils_8h.html#a1">FAILSTOP</a>(); }00219 <span class="keywordtype">void</span> count_unlock() { <span class="keywordtype">int</span> r = htMutexUnlock(&c); <span class="keywordflow">if</span> (r != 0) <a class="code" href="utils_8h.html#a1">FAILSTOP</a>(); }00220 <span class="preprocessor">#else</span>00221 <span class="preprocessor"></span> <span class="keywordtype">void</span> count_lock() { <span class="keywordtype">int</span> r = pthread_mutex_lock(&c); <span class="keywordflow">if</span> (r != 0) <a class="code" href="utils_8h.html#a1">FAILSTOP</a>(); }00222 <span class="keywordtype">void</span> count_unlock() { <span class="keywordtype">int</span> r = pthread_mutex_unlock(&c); <span class="keywordflow">if</span> (r != 0) <a class="code" href="utils_8h.html#a1">FAILSTOP</a>(); }00223 <span class="preprocessor">#endif</span>00224 <span class="preprocessor"></span> thread_id_t owner; <span class="comment">// thread that owns the mutex and is inside the critical section</span>00225 <span class="keywordtype">int</span> numlock; <span class="comment">// number of times the owner thread has locked</span>00226 <a class="code" href="classconsole__c.html">console_c</a> *con; <span class="comment">//debugging...</span>00227 00228 <span class="keyword">private</span>:00229 00230 <span class="preprocessor">#ifdef USE_HAWKTHREADS</span>00231 <span class="preprocessor"></span> HTmutex m;00232 HTmutex c;00233 <span class="preprocessor">#else</span>00234 <span class="preprocessor"></span> pthread_mutex_t m; <span class="comment">//the mutex</span>00235 pthread_mutex_t c; <span class="comment">//mutex for accessing the lock counter map</span>00236 <span class="preprocessor">#endif</span>00237 <span class="preprocessor"></span>00238 <span class="comment">//non-copyable</span>00239 mutex_c(<span class="keyword">const</span> mutex_c&){}00240 mutex_c &operator=(<span class="keyword">const</span> mutex_c&);00241 };00242 00243 <span class="comment">//==================== MUTEX END =====================================================</span>00244 00247 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keyword">class </span>thread_c {00248 <span class="keyword">public</span>:00249 00250 <span class="comment">// function pointer type</span>00251 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* (T::*FPTR_1)(<span class="keywordtype">void</span>*);00252 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* (T::*FPTR_2)(<span class="keywordtype">void</span>*,<span class="keywordtype">void</span>*);00253 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* (T::*FPTR_3)(<span class="keywordtype">void</span>*,<span class="keywordtype">void</span>*,<span class="keywordtype">void</span>*);00254 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* (T::*FPTR_4)(<span class="keywordtype">void</span>*,<span class="keywordtype">void</span>*,<span class="keywordtype">void</span>*,<span class="keywordtype">void</span>*);00255 00257 thread_c() { thread = THREAD_INVALID; 00258 <span class="comment">//con = 0; </span>00259 }00260 00262 <span class="comment">//thread_c(console_c *conio) { thread = THREAD_INVALID; con = conio; }</span>00263 00265 <span class="comment">//thread_c(pthread_t who /*, console_c *conio = 0*/) { thread = who; /*con = conio;*/ }</span>00266 00268 thread_c(<span class="keyword">const</span> thread_c &t) { thread = t.thread; <span class="comment">/*con = t.con;*/</span> }00269 00271 thread_c &operator=(<span class="keyword">const</span> thread_c &t) { <span class="keywordflow">if</span> (*<span class="keyword">this</span> != t) { thread = t.thread; <span class="comment">/*con = t.con;*/</span> } <span class="keywordflow">return</span> (*this); }00272 00279 <span class="keywordtype">bool</span> create(T *cthis, FPTR_1 ptr2member, <span class="keywordtype">bool</span> joinable, <span class="keywordtype">void</span> *arg1) {00280 00281 assert(thread == THREAD_INVALID);00282 zig_thread_runes_t *runes = <span class="keyword">new</span> zig_thread_runes_t; <span class="comment">// create thread args</span>00283 assert(runes);00284 runes->mythis = cthis; <span class="comment">// record the "this" for the call. will be used in pthread_run with a pointer to T::member_func</span>00285 runes->narg = 1;00286 runes->member_1 = ptr2member; <span class="comment">// record the pointer to member. will be used in pthread_run with the this for class T</span>00287 runes->arg1 = arg1;00288 runes->arg2 = (<span class="keywordtype">void</span>*)-666;00289 runes->arg3 = (<span class="keywordtype">void</span>*)-666;00290 runes->arg4 = (<span class="keywordtype">void</span>*)-666;00291 <span class="preprocessor">#ifdef USE_HAWKTHREADS</span>00292 <span class="preprocessor"></span> NLboolean jo; <span class="keywordflow">if</span> (joinable) jo = NL_TRUE; <span class="keywordflow">else</span> jo = NL_FALSE;00293 thread = htThreadCreate(pthread_run, (<span class="keywordtype">void</span> *)runes, jo); <span class="comment">// create thread</span>00294 <span class="keywordflow">if</span> (thread == (HThreadID)HT_INVALID) { SAFEDELETE(runes); }00295 <span class="keywordflow">return</span> (thread != (HThreadID)HT_INVALID);00296 <span class="preprocessor">#else</span>00297 <span class="preprocessor"></span> <span class="keywordtype">int</span> result = pthread_create(&thread, 0, pthread_run, (<span class="keywordtype">void</span> *)runes); <span class="comment">// create thread</span>00298 <span class="keywordflow">if</span> (result != 0) { SAFEDELETE(runes); } <span class="keywordflow">else</span> { <span class="keywordflow">if</span> (joinable == <span class="keyword">false</span>) { <span class="keywordtype">int</span> r = pthread_detach( thread ); assert(r == 0); } }00299 <span class="keywordflow">return</span> (result == 0);00300 <span class="preprocessor">#endif</span>00301 <span class="preprocessor"></span> }00302 00304 <span class="keywordtype">bool</span> create(T *cthis, FPTR_2 ptr2member, <span class="keywordtype">bool</span> joinable, <span class="keywordtype">void</span> *arg1, <span class="keywordtype">void</span> *arg2) {00305 assert(thread == THREAD_INVALID);00306 zig_thread_runes_t *runes = <span class="keyword">new</span> zig_thread_runes_t; <span class="comment">// create thread args</span>00307 assert(runes);00308 runes->mythis = cthis; <span class="comment">// record the "this" for the call. will be used in pthread_run with a pointer to T::member_func</span>00309 runes->narg = 2;00310 runes->member_2 = ptr2member; <span class="comment">// record the pointer to member. will be used in pthread_run with the this for class T</span>00311 runes->arg1 = arg1;00312 runes->arg2 = arg2;00313 runes->arg3 = (<span class="keywordtype">void</span>*)-666;00314 runes->arg4 = (<span class="keywordtype">void</span>*)-666;00315 <span class="preprocessor">#ifdef USE_HAWKTHREADS</span>00316 <span class="preprocessor"></span> NLboolean jo; <span class="keywordflow">if</span> (joinable) jo = NL_TRUE; <span class="keywordflow">else</span> jo = NL_FALSE;00317 thread = htThreadCreate(pthread_run, (<span class="keywordtype">void</span> *)runes, jo); <span class="comment">// create thread</span>00318 <span class="keywordflow">if</span> (thread == (HThreadID)HT_INVALID) { SAFEDELETE(runes); }00319 <span class="keywordflow">return</span> (thread != (HThreadID)HT_INVALID);00320 <span class="preprocessor">#else</span>00321 <span class="preprocessor"></span> <span class="keywordtype">int</span> result = pthread_create(&thread, 0, pthread_run, (<span class="keywordtype">void</span> *)runes); <span class="comment">// create thread</span>00322 <span class="keywordflow">if</span> (result != 0) { SAFEDELETE(runes); } <span class="keywordflow">else</span> { <span class="keywordflow">if</span> (joinable == <span class="keyword">false</span>) { <span class="keywordtype">int</span> r = pthread_detach( thread ); assert(r == 0); } }00323 <span class="keywordflow">return</span> (result == 0);00324 <span class="preprocessor">#endif</span>00325 <span class="preprocessor"></span> }00326 00328 <span class="keywordtype">bool</span> create(T *cthis, FPTR_3 ptr2member, <span class="keywordtype">bool</span> joinable, <span class="keywordtype">void</span> *arg1, <span class="keywordtype">void</span> *arg2, <span class="keywordtype">void</span> *arg3) {00329 assert(thread == THREAD_INVALID);00330 zig_thread_runes_t *runes = <span class="keyword">new</span> zig_thread_runes_t; <span class="comment">// create thread args</span>00331 assert(runes);00332 runes->mythis = cthis; <span class="comment">// record the "this" for the call. will be used in pthread_run with a pointer to T::member_func</span>00333 runes->narg = 3;00334 runes->member_3 = ptr2member; <span class="comment">// record the pointer to member. will be used in pthread_run with the this for class T</span>00335 runes->arg1 = arg1;00336 runes->arg2 = arg2;00337 runes->arg3 = arg3;00338 runes->arg4 = (<span class="keywordtype">void</span>*)-666;00339 <span class="preprocessor">#ifdef USE_HAWKTHREADS</span>00340 <span class="preprocessor"></span> NLboolean jo; <span class="keywordflow">if</span> (joinable) jo = NL_TRUE; <span class="keywordflow">else</span> jo = NL_FALSE;00341 thread = htThreadCreate(pthread_run, (<span class="keywordtype">void</span> *)runes, jo); <span class="comment">// create thread</span>00342 <span class="keywordflow">if</span> (thread == (HThreadID)HT_INVALID) { SAFEDELETE(runes); }00343 <span class="keywordflow">return</span> (thread != (HThreadID)HT_INVALID);00344 <span class="preprocessor">#else</span>00345 <span class="preprocessor"></span> <span class="keywordtype">int</span> result = pthread_create(&thread, 0, pthread_run, (<span class="keywordtype">void</span> *)runes); <span class="comment">// create thread</span>00346 <span class="keywordflow">if</span> (result != 0) { SAFEDELETE(runes); } <span class="keywordflow">else</span> { <span class="keywordflow">if</span> (joinable == <span class="keyword">false</span>) { <span class="keywordtype">int</span> r = pthread_detach( thread ); assert(r == 0); } }00347 <span class="keywordflow">return</span> (result == 0);00348 <span class="preprocessor">#endif</span>00349 <span class="preprocessor"></span> }00350 00352 <span class="keywordtype">bool</span> create(T *cthis, FPTR_4 ptr2member, <span class="keywordtype">bool</span> joinable, <span class="keywordtype">void</span> *arg1, <span class="keywordtype">void</span> *arg2, <span class="keywordtype">void</span> *arg3, <span class="keywordtype">void</span> *arg4) {00353 assert(thread == THREAD_INVALID);00354 zig_thread_runes_t *runes = <span class="keyword">new</span> zig_thread_runes_t; <span class="comment">// create thread args</span>00355 assert(runes);00356 runes->mythis = cthis; <span class="comment">// record the "this" for the call. will be used in pthread_run with a pointer to T::member_func</span>00357 runes->narg = 4;00358 runes->member_4 = ptr2member; <span class="comment">// record the pointer to member. will be used in pthread_run with the this for class T</span>00359 runes->arg1 = arg1;00360 runes->arg2 = arg2;00361 runes->arg3 = arg3;00362 runes->arg4 = arg4;00363 <span class="preprocessor">#ifdef USE_HAWKTHREADS</span>00364 <span class="preprocessor"></span> NLboolean jo; <span class="keywordflow">if</span> (joinable) jo = NL_TRUE; <span class="keywordflow">else</span> jo = NL_FALSE;00365 thread = htThreadCreate(pthread_run, (<span class="keywordtype">void</span> *)runes, jo); <span class="comment">// create thread</span>00366 <span class="keywordflow">if</span> (thread == (HThreadID)HT_INVALID) { SAFEDELETE(runes); }00367 <span class="keywordflow">return</span> (thread != (HThreadID)HT_INVALID);00368 <span class="preprocessor">#else</span>00369 <span class="preprocessor"></span> <span class="keywordtype">int</span> result = pthread_create(&thread, 0, pthread_run, (<span class="keywordtype">void</span> *)runes); <span class="comment">// create thread</span>00370 <span class="keywordflow">if</span> (result != 0) { SAFEDELETE(runes); } <span class="keywordflow">else</span> { <span class="keywordflow">if</span> (joinable == <span class="keyword">false</span>) { <span class="keywordtype">int</span> r = pthread_detach( thread ); assert(r == 0); } }00371 <span class="keywordflow">return</span> (result == 0);00372 <span class="preprocessor">#endif</span>00373 <span class="preprocessor"></span> }00374 00375 <span class="comment">// detach thread: it will be set to non-joinable</span>00376 <span class="keywordtype">bool</span> detach() {00377 assert(thread != THREAD_INVALID);00378 <span class="keywordtype">int</span> r = pthread_detach( thread );00379
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -