c mysql 伺服器 C語言伺服器程式設計必備常識

2021-10-17 20:21:23 字數 2364 閱讀 2114

只有互斥量的主人能夠解鎖它。

執行緒的堆疊受限。

執行緒結束方式要麼從執行緒函式return,要麼呼叫pthread_exit,進入終止態,直到被分離或被連線。建立不需要連線的執行緒應該使用detachstate屬性建立執行緒使其自動分離。

pthread_join會阻塞呼叫者,直到被join的執行緒結束,join返回被連線的執行緒也分離,所以只能被join一次,下一次就錯誤了。

使用條件變數時必須保證如果有執行緒等待,則該執行緒等待後必然會收到訊號(if/while)

條件變數可以使執行緒處於等待狀態而不消耗資源。條件變數必須跟乙個互斥變數一起使用,因為條件變數就是共享的全域性資料??【條件和鎖結合共同保護共享資料】status = pthread_cond_wait(&alarm_cond, &alarm_mutex);

沒有條件變數,程式設計師可用使用輪詢某個變數來實現停等-通知同步,但是非常消耗系統資源。

如果確定執行緒不需要被join, 則申明為detached可以節省系統資源

pthread_self獲得自身的id,只能通過id操作執行緒。main是主線程,主線程停止所有執行緒也停止,main中呼叫pthread_exit,這樣程序就必須等待所有執行緒結束才能終止。

通過向pthread_t(id)=pthread_create傳遞執行緒函式位址和函式引數來建立執行緒。注意當前執行緒從pthread_create返回前,新建立的執行緒可能已經執行完畢了。

舀水桶類似乙個互斥量:桶用來保護「舀水」臨界區【訪問臨界資源(共享資料?)的那段程式是臨界區】。或者將桶理解為:用來確保一次只能由乙個人舀水的不變數。

在訪問共享資料的**段周圍加鎖互斥量,則一次只能有乙個執行緒進入該**段。

pthread_mutex_t表示互斥量,不能拷貝,可以拷貝指標。

當呼叫pthread_mutex_lock時,如果互斥量已經被鎖住,執行緒將被阻塞。呼叫pthread_mutex_trylock時不會阻塞,會返回ebasy,可以做其他的事情去。

互斥量的本質是序列執行。

解決死鎖的兩種方法:一,規定加鎖順序;二,trylock如果不行回退,解鎖所有已加鎖的互斥量

sched_yield()將處理器交給另乙個等待處理的執行緒,如果沒有等待處理的執行緒。立即返回。sleep()可以確保其他執行緒有機會執行。

按照相反的順序解鎖,有助於減少執行緒做回退操作的可能。因為同乙個執行緒函式中加鎖順序是一樣的。對於不同的執行緒函式順序應該不重要

執行緒執行於解鎖和阻塞之間時,其他執行緒才能改變共享資料狀態。此時共享狀態的改變,本執行緒是無法知道的。->需要條件變數。佇列滿,佇列空,滿空就是條件變數。

動態初始化的條件變數需要pthread_cond_destroy來釋放。靜態初始化的不必釋放。釋放前確保其他執行緒不使用他。

在阻塞執行緒之前,條件變數等待操作pthread_cond_wait將解鎖互斥量,重新返回執行緒之前,會再次鎖住互斥量。子執行緒只在pthread_cond_wait等待的短時間內可以加鎖,修改共享資料,然後解鎖。

pthread_cond_timedwait的意思就是我在這裡等time時間,如果時間內條件變數變了,或者不變,我都要跳出while(謂詞)的迴圈,按情況處理。

pthread_cond_wait和pthread_cond_signal必須同時發生才能成功。

互斥量:條件變數是 一對多的關係

當執行緒呼叫pthread_create時,她所能看到的記憶體值也是它建立的執行緒能看到的,之後的執行緒不一定能看到。

執行緒解鎖互斥量時所看到的的資料,也能被後來直接鎖住相同互斥量的執行緒看到。解鎖後寫入的資料,不必被其他執行緒看見(因為那不是用來同步的資料,沒必要所有人看見,同步就應該加鎖)。

執行緒終止,取消,從啟動函式返回,pthread_exit時看到的資料,能夠被連線該執行緒的其他執行緒看到。終止後寫入的資料不會被看到。

執行緒發訊號或廣播時看到的記憶體資料,可以被喚醒執行緒看到。之後寫入的不會。

執行緒分配的堆疊和堆空間是私有的,除非傳給其他執行緒指標。register(暫存器變數)和auto變數(大部分變數預設auto)(static變數的生命期長)中的資料可隨時讀取,像在同步程式中一樣

兩個處理器將各自的快取記憶體中的資料寫入主存的順序是不一定的,即使寫到相應快取記憶體的順序有先後之分。同一執行緒寫資料也未必按照順序重新整理進記憶體,這使得其他執行緒讀取結果不對。

鎖住互斥量->記憶體屏障->記憶體屏障->解鎖互斥量

使用執行緒的方式:流水線、工作組(工作執行緒在資料的不同部分操作)、c/s。

pthread_attr_setdetachstate (&_attr, pthread_create_detached);說明在建立執行緒後,我們不在需要使用執行緒id。

不變數(invariant):程式所做的一些假設,特別是指變數之間的關係。判定條件(predicates):描述不變數狀態的邏輯表示式。

pthread_kill(thdid, sigterm)給特定執行緒發訊號

選定伺服器語言,構建伺服器框架

1 語言 python 2 python的安裝 我選擇的是 python 3.3.2.msi 3 搭建python的flask框架 1 框架選擇 我們選擇的是python中的flask框架,flask是乙個使用python編寫的輕量級web應用框架。基於werkzeug wsgi工具箱和jinja2...

伺服器實現 FTP伺服器的實現(C語言)

我們在之前的文章中,曾經對ftp檔案傳輸協議做過詳細的介紹。本章,我們對如何用c語言實現ftp伺服器做乙個簡單的介紹。概述 ftp檔案傳輸協議,是網際網路上使用得最廣泛的檔案傳輸協議。ftp提供互動式的訪問,允許客戶指明檔案的格式與型別,並允許檔案具有儲存許可權。ftp遮蔽了不同作業系統之前的細節,...

伺服器安裝Linux伺服器

新辦公需要搭建一台伺服器,之前也沒有怎麼搞過,不過有一些了解,於是和同事一起嘗試安裝一下伺服器。本人使用ultraiso燒錄u盤,系統檔案是centos 6.6 x86 64 bin 1.ios,使用urtraiso開啟iso檔案,然後如下圖 接著就可以寫入,u盤會被格式化的,注意備份,等待寫入就可...