亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 11.html

?? 介紹linux下文件和設備編程
?? HTML
?? 第 1 頁 / 共 5 頁
字號:
}<br>void reader_function(void)<br>{<br>w h i l e ( 1 )<br>{<br>semaphore_down( &amp;readers_turn );<br>consume_item( buffer );<br>semaphore_up( &amp;writers_turn );<br>}<br>}<br>這個例子也沒有完全地利用一般信號量的所有函數。我們可以使用信號量重新編寫“Hello world” 的程序:<br>void print_message_function( void *ptr );<br>Semaphore child_counter;<br>Semaphore worlds_turn;<br>main( )<br>{<br>pthread_t thread1, thread2;<br>char *message1 = &quot;Hello&quot;;<br>char *message2 = &quot;Wo r l d &quot; ;<br>semaphore_init( &amp;child_counter );<br>semaphore_init( &amp;worlds_turn );<br>semaphore_down( &amp;worlds_turn ); /* world goes second */<br>semaphore_decrement( &amp;child_counter ); /* value now 0 */<br>semaphore_decrement( &amp;child_counter ); /* value now -1 */<br>/*<br>* child_counter now must be up-ed 2 times for a thread blocked on it<br>* to be released<br>*<br>* /<br>pthread_create( &amp;thread1, pthread_attr_default,<br>(void *) &amp;print_message_function, (void *) message1);<br>semaphore_down( &amp;worlds_turn );<br>pthread_create(&amp;thread2, pthread_attr_default,<br>(void *) &amp;print_message_function, (void *) message2);<br>semaphore_down( &amp;child_counter );<br>/* not really necessary to destroy since we are exiting anyway */<br>semaphore_destroy ( &amp;child_counter );<br>semaphore_destroy ( &amp;worlds_turn );<br>e x i t ( 0 ) ;<br>}<br>void print_message_function( void *ptr )<br>{<br>char *message;<br>message = (char *) ptr;<br>printf(&quot;%s &quot;, message);<br>fflush(stdout);<br>semaphore_up( &amp;worlds_turn );<br>semaphore_up( &amp;child_counter );<br>p t h r e a d _ e x i t ( 0 ) ;<br>}<br>信號量c h i l d _ c o u n t e r用來強迫父線程阻塞,直到兩個子線程執行完p r i n t f語句和其后的semaphore_up( &amp;child_counter )語句才繼續執行。<p>Semaphore.h<p>#ifndef SEMAPHORES<br>#define SEMAPHORES<br>#include<br>#include<br>typedef struct Semaphore<br>{<br>int v;<br>pthread_mutex_t mutex;<br>pthread_cond_t cond;<br>}<br>S e m a p h o r e ;<br>int semaphore_down (Semaphore * s);<br>int semaphore_decrement (Semaphore * s);<br>int semaphore_up (Semaphore * s);<br>void semaphore_destroy (Semaphore * s);<br>void semaphore_init (Semaphore * s);<br>int semaphore_value (Semaphore * s);<br>int tw_pthread_cond_signal (pthread_cond_t * c);<br>int tw_pthread_cond_wait (pthread_cond_t * c, pthread_mutex_t * m);<br>int tw_pthread_mutex_unlock (pthread_mutex_t * m);<br>int tw_pthread_mutex_lock (pthread_mutex_t * m);<br>void do_error (char *msg);<br># e n d i f<p>Semaphore.c<p>#include &quot;semaphore.h&quot;<br>/ *<br>* function must be called prior to semaphore use.<br>*<br>* /<br>v o i d<br>semaphore_init (Semaphore * s)<br>{<br>s-&gt;v = 1;<br>if (pthread_mutex_init (&amp;(s-&gt;mutex), pthread_mutexattr_default) == -1)<br>do_error (&quot;Error setting up semaphore mutex&quot;);<br>if (pthread_cond_init (&amp;(s-&gt;cond), pthread_condattr_default) == -1)<br>do_error (&quot;Error setting up semaphore condition signal&quot;);<br>* function should be called when there is no longer a need for<br>* the semaphore.<br>*<br>* /<br>v o i d<br>semaphore_destroy (Semaphore * s)<br>{<br>if (pthread_mutex_destroy (&amp;(s-&gt;mutex)) == -1)<br>do_error (&quot;Error destroying semaphore mutex&quot;);<br>if (pthread_cond_destroy (&amp;(s-&gt;cond)) == -1)<br>do_error (&quot;Error destroying semaphore condition signal&quot;);<br>}<br>/ *<br>* function increments the semaphore and signals any threads that<br>* are blocked waiting a change in the semaphore.<br>*<br>* /<br>i n t<br>semaphore_up (Semaphore * s)<br>{<br>int value_after_op;<br>tw_pthread_mutex_lock (&amp;(s-&gt;mutex));<br>( s - &gt; v ) + + ;<br>value_after_op = s-&gt;v;<br>tw_pthread_mutex_unlock (&amp;(s-&gt;mutex));<br>tw_pthread_cond_signal (&amp;(s-&gt;cond));<br>return (value_after_op);<br>}<br>/ *<br>* function decrements the semaphore and blocks if the semaphore is<br>* &lt;= 0 until another thread signals a change.<br>*<br>* /<br>i n t<br>semaphore_down (Semaphore * s)<br>{<br>int value_after_op;<br>tw_pthread_mutex_lock (&amp;(s-&gt;mutex));<br>while (s-&gt;v &lt;= 0)<br>{<br>tw_pthread_cond_wait (&amp;(s-&gt;cond), &amp;(s-&gt;mutex));<br>}<br>( s - &gt; v ) - - ;<br>value_after_op = s-&gt;v;<br>tw_pthread_mutex_unlock (&amp;(s-&gt;mutex));<br>return (value_after_op);<br>}<br>/ *<br>* function does NOT block but simply decrements the semaphore.<br>* should not be used instead of down -- only for programs where<br>* multiple threads must up on a semaphore before another thread<br>* can go down, i.e., allows programmer to set the semaphore to<br>* a negative value prior to using it for synchronization.<br>*<br>* /<br>i n t<br>semaphore_decrement (Semaphore * s)<br>{<br>int value_after_op;<br>tw_pthread_mutex_lock (&amp;(s-&gt;mutex));<br>s - &gt; v - - ;<br>value_after_op = s-&gt;v;<br>tw_pthread_mutex_unlock (&amp;(s-&gt;mutex));<br>return (value_after_op);<br>}<br>/ *<br>* function returns the value of the semaphore at the time the<br>* critical section is accessed. obviously the value is not guarenteed<br>* after the function unlocks the critical section. provided only<br>* for casual debugging, a better approach is for the programmar to<br>* protect one semaphore with another and then check its value.<br>* an alternative is to simply record the value returned by semaphore_up<br>* or semaphore_down.<br>*<br>* /<br>i n t<br>semaphore_value (Semaphore * s)<br>{<br>/* not for sync */<br>int value_after_op;<br>tw_pthread_mutex_lock (&amp;(s-&gt;mutex));<br>value_after_op = s-&gt;v;<br>tw_pthread_mutex_unlock (&amp;(s-&gt;mutex));<br>return (value_after_op);<br>}<br>/* -------------------------------------------------------------------- */<br>/* The following functions replace standard library functions in that */<br>/* they exit on any error returned from the system calls. Saves us */<br>/* from having to check each and every call above. */<br>/* -------------------------------------------------------------------- */<br>i n t<br>tw_pthread_mutex_unlock (pthread_mutex_t * m)<br>{<br>int return_value;<br>if ((return_value = pthread_mutex_unlock (m)) == -1)<br>do_error (&quot;pthread_mutex_unlock&quot;);<br>return (return_value);<br>}<br>i n t<br>tw_pthread_mutex_lock (pthread_mutex_t * m)<br>{<br>int return_value;<br>if ((return_value = pthread_mutex_lock (m)) == -1)<br>do_error (&quot;pthread_mutex_lock&quot;);<br>return (return_value);<br>}<br>i n t<br>tw_pthread_cond_wait (pthread_cond_t * c, pthread_mutex_t * m)<br>{<br>int return_value;<br>if ((return_value = pthread_cond_wait (c, m)) == -1)<br>do_error (&quot;pthread_cond_wait&quot;);<br>return (return_value);<br>}<br>i n t<br>tw_pthread_cond_signal (pthread_cond_t * c)<br>{<br>int return_value;<br>if ((return_value = pthread_cond_signal (c)) == -1)<br>do_error (&quot;pthread_cond_signal&quot;);<br>return (return_value);<br>}<br>/ *<br>* function just prints an error message and exits<br>*<br>* /<br>v o i d<br>do_error (char *msg)<br>{<br>perror (msg);<br>exit (1);<br>}<p><p><p><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I263" ID="I263"></A><center><b><font size=+2>代碼例子</font></b></center><br><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I264" ID="I264"></A><center><b><font size=+2>newthread</font></b></center><br>/***********************************************************************<br>&nbsp;&nbsp;&nbsp; Case study source code from the book `The Linux A to Z'<br>&nbsp;&nbsp;&nbsp; by Phil Cornes. Published by Prentice Hall, 1996.<br>&nbsp;&nbsp;&nbsp; Copyright (C) 1996 Phil Cornes<p>&nbsp;&nbsp;&nbsp; This program is free software; you can redistribute it and/or modify<br>&nbsp;&nbsp;&nbsp; it under the terms of the GNU General Public License as published by<br>&nbsp;&nbsp;&nbsp; the Free Software Foundation; either version 2 of the License, or<br>&nbsp;&nbsp;&nbsp; (at your option) any later version.<p>&nbsp;&nbsp;&nbsp; This program is distributed in the hope that it will be useful,<br>&nbsp;&nbsp;&nbsp; but WITHOUT ANY WARRANTY; without even the implied warranty of<br>&nbsp;&nbsp;&nbsp; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&nbsp; See the<br>&nbsp;&nbsp;&nbsp; GNU General Public License for more details.<p>&nbsp;&nbsp;&nbsp; You should have received a copy of the GNU General Public License<br>&nbsp;&nbsp;&nbsp; along with this program; if not, write to the Free Software<br>&nbsp;&nbsp;&nbsp; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.<br>***********************************************************************/<p>new_thread(int (*start_addr)(void), int stack_size)<br>{<br>&nbsp;&nbsp;&nbsp; struct context *ptr;<br>&nbsp;&nbsp;&nbsp; int esp;<p>&nbsp;&nbsp;&nbsp; /* 1 */<br>&nbsp;&nbsp;&nbsp; if (!(ptr = (struct context *)malloc(sizeof(struct context))))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<p>&nbsp;&nbsp;&nbsp; /* 2 */<br>&nbsp;&nbsp;&nbsp; if (!(ptr-&gt;stack = (char *)malloc(stack_size)))<br>&nbsp;&nbsp;&

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国模冰冰炮一区二区| 成人性生交大片免费看中文网站 | 午夜精品久久久久影视| 日本韩国欧美在线| 亚洲人亚洲人成电影网站色| 成人免费观看视频| 亚洲国产电影在线观看| 成人影视亚洲图片在线| 国产精品国产三级国产aⅴ原创 | 337p粉嫩大胆噜噜噜噜噜91av| 免费在线观看日韩欧美| 日韩精品一区二区三区中文不卡| 午夜不卡在线视频| 91精品国产色综合久久久蜜香臀| 亚洲成av人**亚洲成av**| 欧美久久久久久蜜桃| 日韩不卡一二三区| 欧美变态tickle挠乳网站| 久久精品国产77777蜜臀| 久久综合给合久久狠狠狠97色69| 国产在线精品一区在线观看麻豆| 精品噜噜噜噜久久久久久久久试看| 韩国一区二区视频| 中文字幕第一区综合| 97国产一区二区| 一区二区在线免费| 在线综合+亚洲+欧美中文字幕| 人人超碰91尤物精品国产| 精品国产乱码久久久久久闺蜜| 国产一区二区在线影院| 国产精品视频你懂的| 91丨porny丨最新| 亚洲国产日韩一区二区| 日韩一卡二卡三卡四卡| 狠狠色丁香九九婷婷综合五月| 久久精品一区二区三区不卡牛牛| 成人性视频免费网站| 又紧又大又爽精品一区二区| 欧美日韩国产高清一区二区 | 亚洲色欲色欲www| 欧美亚洲图片小说| 美女一区二区三区| 国产人久久人人人人爽| 色婷婷国产精品综合在线观看| 亚洲va欧美va天堂v国产综合| 日韩一区二区免费视频| 福利电影一区二区| 亚洲国产中文字幕在线视频综合| 日韩色视频在线观看| 国产91精品在线观看| 亚洲自拍偷拍九九九| 日韩视频在线永久播放| 成人午夜视频网站| 亚洲一区二区三区四区中文字幕| 日韩欧美一卡二卡| 99久免费精品视频在线观看| 午夜激情一区二区| 国产日韩欧美一区二区三区综合| 色狠狠色狠狠综合| 激情偷乱视频一区二区三区| 亚洲人成影院在线观看| 日韩欧美国产综合| 91精品欧美久久久久久动漫| 精品一区二区免费| 一区二区三区在线视频观看58| 日韩欧美一区在线| 99re视频这里只有精品| 人人超碰91尤物精品国产| 国产精品久久久久久福利一牛影视| 欧美日本不卡视频| 成人一区二区视频| 男男成人高潮片免费网站| 亚洲欧洲国产日韩| 欧美成人精品1314www| 色综合色狠狠综合色| 久久精品99国产国产精| 亚洲嫩草精品久久| 国产亚洲精品7777| 91麻豆精品91久久久久同性| www.亚洲激情.com| 麻豆久久一区二区| 亚洲一区二区三区视频在线 | 精品国产三级a在线观看| 日本精品一级二级| 国产69精品久久777的优势| 亚洲成人动漫一区| 日韩一区中文字幕| 久久人人爽人人爽| 7777精品伊人久久久大香线蕉的 | 亚洲欧洲日韩一区二区三区| 日韩视频一区在线观看| 在线观看免费一区| 成人听书哪个软件好| 男女性色大片免费观看一区二区| 玉足女爽爽91| 国产精品女上位| 精品成人一区二区三区四区| 欧美另类变人与禽xxxxx| 91丨九色丨尤物| 国产1区2区3区精品美女| 久久99蜜桃精品| 婷婷国产在线综合| 樱花草国产18久久久久| 国产精品久久久一本精品| 精品国产乱码久久久久久久久 | 91小视频在线观看| 国产a精品视频| 久久99精品久久只有精品| 日韩福利电影在线| 亚洲一区欧美一区| 亚洲人成网站色在线观看| 国产精品区一区二区三区| 精品国产91乱码一区二区三区| 欧美放荡的少妇| 欧美日韩成人高清| 欧美日韩午夜影院| 精品视频一区二区不卡| 91黄色在线观看| 色成年激情久久综合| 99re这里都是精品| 91色婷婷久久久久合中文| 99re亚洲国产精品| 91亚洲精品乱码久久久久久蜜桃 | 成人精品一区二区三区中文字幕| 国产又黄又大久久| 精品午夜一区二区三区在线观看| 奇米亚洲午夜久久精品| 日韩激情一二三区| 日日噜噜夜夜狠狠视频欧美人| 亚洲一区二区三区四区不卡| 亚洲国产另类精品专区| 亚洲国产乱码最新视频| 亚洲成人先锋电影| 婷婷丁香激情综合| 日韩激情在线观看| av电影在线观看一区| 福利电影一区二区三区| 秋霞国产午夜精品免费视频| 日韩精品一区第一页| 日韩av一级片| 久久不见久久见免费视频1 | 亚洲国产欧美在线人成| 亚洲第一福利视频在线| 日韩精品视频网站| 久久99精品一区二区三区三区| 精品一区二区日韩| 懂色av一区二区三区蜜臀| 99久久国产综合精品麻豆| 2021久久国产精品不只是精品| 精品乱人伦小说| 国产无人区一区二区三区| 国产精品久久久久久久久免费丝袜| ...中文天堂在线一区| 一区二区三区欧美视频| 亚洲va欧美va国产va天堂影院| 日本午夜精品一区二区三区电影| 久久99久久精品| www.亚洲色图| 欧美日韩高清一区二区不卡 | 欧美xxxx在线观看| 中文字幕乱码亚洲精品一区| 亚洲日本成人在线观看| 亚洲国产成人tv| 美日韩一区二区| 国产精品99久久久久久久vr| 99re视频这里只有精品| 欧美精选午夜久久久乱码6080| 精品剧情在线观看| 国产精品色在线| 一个色在线综合| 蓝色福利精品导航| 不卡av在线网| 欧美色窝79yyyycom| 久久蜜桃一区二区| 一区二区三区蜜桃| 黑人巨大精品欧美一区| 91美女在线看| 91精品国产综合久久久久久 | 一区二区三区蜜桃网| 亚洲一级二级在线| 一区二区三区波多野结衣在线观看| 久久先锋资源网| 欧美不卡一区二区三区| 欧美一区二区女人| 91麻豆精品国产91久久久资源速度 | 国产一区二区三区不卡在线观看 | 性做久久久久久久久| 另类专区欧美蜜桃臀第一页| 成人av网站在线| 欧美高清视频不卡网| 欧美国产一区视频在线观看| 一区二区三区不卡视频在线观看| 久久97超碰国产精品超碰| caoporen国产精品视频| 91麻豆精品国产91久久久久久久久 | 色婷婷精品大在线视频| 日韩片之四级片| 久久99久久精品| 色哟哟日韩精品| 久久久青草青青国产亚洲免观|