Ⅰ 有兩個問題關於c語言線程進程的,還望高手解答
程序的進度是以線程為單位向前推進的,很顯然線程屬於某一進程,進程擁有了程序實例的基本資源,在單核處理器的情況下,顯然系統中只能有一個線程在執行,而在多核的情況就有些復雜了,要看程序與系統如何處理。
你說的鎖應該是線程互斥量的使用,一般對於臨界代碼會使用類似於下面的代碼
pthread_mutex_lock(&mysql_mutex);
// some critical code ...
pthread_mutex_unlock(&mysql_mutex);
其實系統中的鎖並不是加給了要訪問的資源或執行的代碼,而是創建的互斥量,如果代碼不使用下面的機制
pthread_mutex_lock(&mysql_mutex);
// some critical code ...
pthread_mutex_unlock(&mysql_mutex);
直接
// some critical code ...
這肯定是可以執行的,但是這背離了我們使用鎖的初衷。
加鎖進程對一互斥量加鎖之後,是直接執行臨界代碼的,然後再釋放互斥量,如果另一線程需要執行臨界代碼,同時又使用了鎖的機制,那麼它就會檢查互斥量是否被鎖住,如果被鎖住會阻塞等待,若不是,就會為互斥量加鎖,並隨之進入臨界代碼,最後釋放互斥量。
Ⅱ c語言多線程消費者與生產者----互斥鎖與一般情況
問題是啥?你的mutex怎麼不init
Ⅲ 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初始值
Ⅳ C語言實現死鎖
如果是java就好了,無能為力呀!
Ⅳ C語言變數鎖
在當前線程用mutex互斥鎖把改變變數鎖住,其他的線程在讀寫該變數前先獲取該鎖,這樣如果主線程在使用了該鎖,那其他線程就要等該鎖被釋放了,才能獲取到該鎖,才能對變數操作
Ⅵ c語言程序,多線程對同一int變數進行讀寫,是否需要加鎖(貌似java中這是原子操作,不必加鎖)
如果變數是匯流排程,也就是多線程都對該int進行讀寫,就要加鎖……
Ⅶ C語言多線程問題
這涉及到進程/線程調度問題。cpu處理那個線程或者進程看系統實現,不存在順序。
想要達到你的要求(可控線程執行順序),需要使用線程同步的相關技術。
例如,線程鎖,信號都可以。
sleep僅僅是飲鴆止渴,無法真正保證多線程或者進程間執行順序。
Ⅷ (C語言中)互斥鎖的死鎖問題
如果你將mutex_c換成mutex_p,則不會死鎖,因為,你第一個線程鎖上後,切換到第二個線程,因為mutex_p未釋放,第二個線程無法獲取mutex_p,進入等待狀態,此時OS將再次調度第一個線程,直到第一個線程釋放mutex_p之後,第二個線程才會被激活,然後調試第二線程,獲取mutex_p.
使用OS提供的互斥量來保護公共資源還是比較安全的,但如果用二值信號量的話,就可能會有優先順序反轉的情況.
Ⅸ 用C語言證明線程中的互斥鎖可以是棧區變數或者堆區變數嗎
最好是全局變數或者是全局對象的成員變數,當然如果能保障在多個線程運行中,互斥鎖一直有效的話,成員變數也可以。
Ⅹ C語言互斥鎖
C裡面的線程鎖這要看你用什麼庫了。不同的函數庫api可能不同,我建議你可以參考一下apache的APR,那裡面的庫函數都可以跨平台使用,而且也不太復雜,看看它的幫助就能學會
參考網址:apr.apache.org