① C++ sync()的用法
不知道你用的是什麼編譯器,我做測試是sync()生效了(vc2013)
這是用了sync的:
② sync是什麼
sync(意指Synchronize,即「同步」)為UNIX操作系統的標准系統調用,功能為將內核文件系統緩沖區的所有數據。
sync作為C語言的函數之一,sync()一般以void sync(void)的形式在unistd.h內聲明。該函數也可以從命令行執行sync命令的方式調用,同時在其他程序語言(如Perl)中也有名字與之相似的函數。
UNIX中還有一些與sync相似的系統調用,如fsync與fdatasync。其中fsync負責寫入所有與特定文件描述符相關的緩沖區數據;fdatasync功能與fsync相似,但只負責寫入文件中被變更的數據,而不會修改文件的元數據(如文件屬性)。
sync在資料庫中的應用
在對數據進行修改操作(包括增、刪、改)時,被修改的數據一般僅是暫存於基於內存的寫入緩存,而當掉電時這些修改便會丟失;而為保證數據的持久性,資料庫必須使用某些形式的sync,以確保修改的內容切實寫入非易失性存儲器,如PostgreSQL就使用了多種sync類調用(包括fsync與fdatasync)來達到這一目的。
但是,對於旋轉尋道的硬碟來說,每次旋轉只能完成一項「提交」操作以將客戶端的修改寫入,因此每秒最多隻能完成幾百次的「提交」操作;而若關閉fsync的限定來放寬要求,則可大幅提升性能,但同時也會帶來系統崩潰後資料庫損毀的潛在危險。有鑒於此,資料庫也使用囊括最近修改信息的日誌文件(一般比主題數據文件小得多)來保障可靠性:根據日誌文件,系統管理員可以在系統崩潰後准確地重做修改操作,以此即可減少對主要數據文件的sync操作。
③ C語言同步和非同步的區別
同步:代碼立即執行
非同步:代碼程序先在隊列排隊,等到可以執行再去執行。
④ C語言中「sync();」是什麼意思
sync是C語言的一個庫函數。調用sync可以將系統緩沖區(內存中)的數據寫入到文件系統(磁碟)中。x0dx0async的聲明為:x0dx0ax0dx0aint sync(void);x0dx0a位於頭文件unistd.h。x0dx0a當同步成功返回0,否則返回-1。x0dx0a功能為將系統緩沖區的內容寫回磁碟,以確保數據同步。x0dx0a在操作系統中,除非設置了自動同步,否則為了減少磁碟的寫入量,延長磁碟壽命,寫入文件時並不是即時寫入到磁碟中,而是先寫入內存,這段內存區域被稱為系統緩沖區。在系統緩沖區數據累計到一定數量後(具體數量因系統實際設置而定),會有系統進程一次性寫入所有緩沖數據。這樣,如果意外斷電,那麼系統緩沖區內數據就會因此丟失。於是在寫入一些重要數據時,都會在寫入結束後進行一次sync()的調用,保證數據已經被寫入磁碟,降低數據丟失或損壞的可能性。
⑤ C語言如何在線程間實現同步和互斥
線程之間的同步和互斥解決的問題是線程對共同資源進行訪問。Posix有兩種方式:
信號量和互斥鎖;信號量適用同時可用的資源為多個的情況;互斥鎖適用於線程可用的資源只有一個的情況
1、互斥鎖:互斥鎖是用加鎖的方式來控制對公共資源的原子操作(一旦開始進行就不會被打斷的操作)
互斥鎖只有上鎖和解鎖兩種狀態。互斥鎖可以看作是特殊意義的全局變數,因為在同一時刻只有一個線程能夠對互斥鎖進行操作;只有上鎖的進程才可以對公共資源進行訪問,其他進程只能等到該進程解鎖才可以對公共資源進行操作。
互斥鎖操作函數:
pthread_mutex_init();//初始化
pthread_mutex_lock();//上鎖 參數:pthread_mutex_t *mutex
pthread_mutex_trylock();//判斷上鎖 參數:pthread_mutex_t *mutex
pthread_mutex_unlock();//解鎖 參數:pthread_mutex_t *mutex
pthread_mutex_release();//消除互斥鎖 參數:pthread_mutex_t *mutex
互斥鎖分為快速互斥鎖、遞歸互斥鎖、檢錯互斥鎖;在 init 的時候確定
int pthread_mutex_t(pthread_mutex_t *mutex, const pthread_mutex_t mutexattr);
第一個參數:進行操作的鎖
mutexattr:鎖的類型,默認快速互斥鎖(阻塞)123456789
2、信號量:信號量本質上是一個計數器,在操作系統做用於PV原子操作;
P操作使計數器-1;V操作使計數器+1.
在互斥操作中可以是使用一個信號量;在同步操作中需要使用多個信號量,並設置不同的初始值安排它們順序執行
sem_init(); // 初始化操作
sem_wait(); // P操作,計數器減一;阻塞 參數:sem_t *sem
sem_trywait(); // P操作,計數器減一;非阻塞 參數:sem_t *sem
sem_post(); // V操作,計數器加一 參數:sem_t *sem
sem_destroy(); // 銷毀信號量 參數:sem_t *sem
sem_init(sem_t *sem, int pshared, int value);
pshared用於指定多少個進程共享;value初始值