電商專業(yè)學(xué)習(xí)嵌入式軟件開發(fā)第四十八天

  • 系統(tǒng)編程第四天

今天講的都是線程相關(guān)內(nèi)容,而且這些內(nèi)容不能放在進(jìn)程中使用迅矛。個人感覺最大難點(diǎn)還是代碼的實(shí)際應(yīng)用,其他的通過老師的代碼還是可以看明白,最后一個線程鎖老師直接放在鏈表里面講了,而且還聲明這塊內(nèi)容以后肯定要用到的,要會用,不知道是不是例子涉及到鏈表了,感覺線程鎖還是沒搞懂荡碾。
最近有同學(xué)給老師提意見了,現(xiàn)在上課也能跟著老師敲代碼了,最起碼感覺效果比之前好多了,不用一直都是一臉懵逼的狀態(tài)了皂岔。
今天老師留的作業(yè)也涉及到前面的內(nèi)容,但是看了一下題目要求感覺還是那么難。

線程(thread)

  1. 隸屬于進(jìn)程(不可以獨(dú)立存在)
    一個進(jìn)程中可以包含多個線程
    如果一個進(jìn)程創(chuàng)建了n個線程,則這個進(jìn)程中包含了n+1(主線程)個線程
    a. 僅有主線程的單進(jìn)程
    b. 多進(jìn)程(每個進(jìn)程也僅有一個主線程)
    c. 包含多個線程的單進(jìn)程
    d. 包含多線程的多個進(jìn)程
  2. 線程僅有自己獨(dú)立的棧區(qū)(數(shù)據(jù)區(qū)苍苞、代碼區(qū)、堆區(qū)整個進(jìn)程中的所有線程共享)
  3. 所有線程相關(guān)函數(shù)都以pthread_XXXX開頭
    所有調(diào)用線程函數(shù)的程序編譯時需加-lpthread
  4. pthread_create
    int pthread_create(
                        pthread_t *thread, 
                        const pthread_attr_t *attr,
                        void *(*start_routine) (void *), 
                        void *arg);
    ```
5. pthread_join
    ```int pthread_join(pthread_t thread, void **retval);```
    該函數(shù)用于對可聯(lián)結(jié)線程做善后處理狼纬,主要過程如下:
    1) 等待指定線程終止
    2) 獲取指定線程終止后返回的信息
    3) 釋放已終止線程占用的資源
    
6. pthread_exit:讓調(diào)用線程從調(diào)用該函數(shù)處中途退出(不推薦使用羹呵,了解)
void pthread_cleanup_push(void (*rtn) (void *), void * arg);
void pthread_cleanup_pop(int execute);
void pthread_exit(void *retval);    
```
  1. pthread_cancel:向指定線程發(fā)送一個取消請求(不常用,了解)
    int pthread_cancel(pthread_t thread);
    ```
8. 線程按是否響應(yīng)取消請求分為兩種:(不常用疗琉,了解)
    1) 響應(yīng)取消請求的線程(默認(rèn))
    2) 不響應(yīng)取消請求的線程
int pthread_setcancelstate(int state, int *oldstate);
state取值:
PTHREAD_CANCEL_ENABLE
PTHREAD_CANCEL_DISABLE
該函數(shù)只能讓一個線程自己決定是否響應(yīng)取消請求
```
  1. 線程按是否可聯(lián)結(jié)分為兩種:
    1. 可聯(lián)結(jié)線程(默認(rèn))
    2. 分離的線程
      創(chuàng)建線程時讓線程為分離的函數(shù):
    int pthread_attr_init(pthread_attr_t  * pAttr);
    int pthread_attr_destroy(pthread_attr_t  * pAttr);
    int pthread_attr_getdetachstate(const pthread_attr_t *pAttr, int*detachstate);
    int pthread_attr_setdetachstate(pthread_attr_t *pAttr, int detachstate);
    detachstate的取值:
    PTHREAD_CREATE_DETACHED
    PTHREAD_CREATE_JOINABLE
 
    /*將已創(chuàng)建成功的線程置為分離的冈欢,過程不可逆(不推薦使用,了解)*/
    int pthread_detach(pthread_t thread);
      ```
    
10. 共享資源:并行執(zhí)行的任務(wù)都可以使用資源
    并行執(zhí)行的任務(wù)同時使用共享資源盈简,會出現(xiàn)沖突或數(shù)據(jù)混亂的現(xiàn)象稱為:競態(tài)”
    為了解決“競態(tài)”現(xiàn)象凑耻,需要使用一種機(jī)制解決沖突,這樣的機(jī)制被稱為:同步機(jī)制
    同步機(jī)制兩大核心操作:
    1)P(-)操作:如果能夠獲得想要的資源立即返回柠贤,如果不能夠獲得想要的資源則排隊等待
    2)V(+)操作:使用完共享資源的任務(wù)要立即調(diào)用該操作香浩,一方面將資源置空閑,另一方面通知等待使用資源的其它任務(wù)
    
    什么是信號量:一種典型的同步機(jī)制臼勉。它不但提供了監(jiān)控可用共享資源數(shù)量的計數(shù)牌邻吭,還提供一套供沒法獲得共享資源的任務(wù)排隊用的機(jī)制
    ```
    代碼模板:
    a. 多個任務(wù)如何避免同時使用共享資源:
    P操作;
    ...........//臨界區(qū):即使用共享資源的一段代碼
    V操作

    b. A任務(wù)完成一件事后通知B任務(wù)可以開始做另一件事了
        A任務(wù)操作完共享資源后調(diào)V操作,B任務(wù)則在使用共享資源前調(diào)P操作
    ```
    
11. 針對多線程宴霸,Linux系統(tǒng)提供了如下幾種機(jī)制:
a. 線程信號量:多個共享資源的控制問題
頭文件:#include <semaphore.h>
類型:sem_t
初始化:int sem_init(sem_t *sem, int pshared, unsigned int value);
清理:int sem_destroy(sem_t *sem);
P操作: int sem_wait(sem_t *sem);
V操作: int sem_post(sem_t *sem);

b. 線程互斥鎖:單個共享資源的控制問題
頭文件:#include <pthread.h>
類型:pthread_mutex_t
          PTHREAD_MUTEX_INITIALIZER 初始化
初始化:int pthread_mutex_init(pthread_mutex_t * mutex, NULL);
清理:int pthread_mutex_destroy(pthread_mutex_t * mutex);
阻塞P操作: int pthread_mutex_lock(pthread_mutex_t * mutex);
V操作: int pthread_mutex_unlock(pthread_mutex_t * mutex);

c. 線程讀寫鎖:讀者-寫者
頭文件:#include <pthread.h>
類型:pthread_rwlock_t
初始化:int pthread_rwlock_init(pthread_rwlock_t * rwlock, NULL);
清理:int pthread_rwlock_destroy(pthread_ rwlock _t * rwlock);
阻塞讀鎖P操作: int pthread_rwlock_rdlock(pthread_ rwlock _t * rwlock);
阻塞寫鎖P操作: int pthread_rwlock_wrlock(pthread_ rwlock _t * rwlock);
V操作: int pthread_rwlock_unlock(pthread_ rwlock _t * rwlock);

d. 線程條件變量:解決同步問題(現(xiàn)階段不要求掌握)
```
  1. 作業(yè):
    主線程負(fù)責(zé)修改包含有10個整型數(shù)組元素的值(建議用隨機(jī)數(shù)給元素賦值)(可以每隔幾秒修改一次))
    創(chuàng)建一個新的線程負(fù)責(zé)囱晴,主線程一旦修改好數(shù)組內(nèi)容膏蚓,就對該數(shù)組排序后輸出
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市畸写,隨后出現(xiàn)的幾起案子驮瞧,更是在濱河造成了極大的恐慌,老刑警劉巖枯芬,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件论笔,死亡現(xiàn)場離奇詭異,居然都是意外死亡千所,警方通過查閱死者的電腦和手機(jī)狂魔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來真慢,“玉大人毅臊,你說我怎么就攤上這事『诮纾” “怎么了管嬉?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長朗鸠。 經(jīng)常有香客問我蚯撩,道長,這世上最難降的妖魔是什么烛占? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任胎挎,我火速辦了婚禮,結(jié)果婚禮上忆家,老公的妹妹穿的比我還像新娘犹菇。我一直安慰自己,他們只是感情好芽卿,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布揭芍。 她就那樣靜靜地躺著,像睡著了一般卸例。 火紅的嫁衣襯著肌膚如雪称杨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天筷转,我揣著相機(jī)與錄音姑原,去河邊找鬼。 笑死呜舒,一個胖子當(dāng)著我的面吹牛锭汛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼店乐,長吁一口氣:“原來是場噩夢啊……” “哼艰躺!你這毒婦竟也來了呻袭?” 一聲冷哼從身側(cè)響起眨八,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎左电,沒想到半個月后廉侧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡篓足,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年段誊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栈拖。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡连舍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涩哟,到底是詐尸還是另有隱情索赏,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布贴彼,位于F島的核電站潜腻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏器仗。R本人自食惡果不足惜融涣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望精钮。 院中可真熱鬧威鹿,春花似錦、人聲如沸轨香。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弹沽。三九已至檀夹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間策橘,已是汗流浹背炸渡。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丽已,地道東北人蚌堵。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吼畏。 傳聞我的和親對象是個殘疾皇子督赤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容