1、Linux 安裝VirtualBox時出錯
只是warning,沒有錯誤,可忽略
這種問題一般是因為內核版本較新,與vbox內核模塊的開發版本不一致引起
2、如何使用Linux提供的信號量來實現進程的互斥和同步?
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<semaphore.h>
#include<stdlib.h>
#define N 3
pthread_mutex_t mutex_w,mutex_r; // 定義讀寫互斥鎖
sem_t sem_w,sem_r; //定義讀寫信號量
int data[N];
int pos=0;
void *function_w(void *arg)
{
int w = *(int *)arg;
pos = w;
while(1)
{
usleep(100000);
sem_wait(&sem_w);//等待可寫的資源
pthread_mutex_lock(&mutex_w);//禁止別的線程寫此資源
data[pos] = w;
w++;
w++;
w++;
pos++;
pos=pos%N;
pthread_mutex_unlock(&mutex_w);//別的線程可寫此資源
sem_post(&sem_r);// 釋放一個讀資源
}
return (void *)0;
}
void *function_r(void *arg)
{
while(1)
{
sem_wait(&sem_r);//等待可讀的資源
pthread_mutex_lock(&mutex_r);//禁止別的線程讀此資源
printf("%d\n",data[(pos+N-1)%N]);
pthread_mutex_unlock(&mutex_r);//別的線程可讀此資源
sem_post(&sem_w);// 釋放一個寫資源
}
return (void *)0;
}
int main(int argc, char **argv)
{
pthread_t thread[2*N];
int i;
pthread_mutex_init(&mutex_w,NULL);
pthread_mutex_init(&mutex_r,NULL);
sem_init(&sem_w,0,N);
sem_init(&sem_r,0,0);
for(i=0;i<N;i++)
{
if ( pthread_create(&thread[i],NULL,function_w,(void *)&i) < 0)//創建寫線程
{
perror("pthread_create");
exit(-1);
}
}
for(i=N;i<2*N;i++)
{
if ( pthread_create(&thread[i],NULL,function_r,NULL) < 0)//創建讀線程
{
perror("pthread_create");
exit(-1);
}
}
sleep(1);
return(0);
}
3、linux下多線程同步
你的問題不是互斥的問題,而是傳給子線程的 i 是指針,在子線程獲取 *arg 時,主線程的 for 循環可能已經修改或者沒有修改 i 的值,從而出現問題。下面的代碼直接把 i 的值傳給子線程,而不是傳指針,就不會有問題了。
4、多線程編程的原則以及Sem信號量和Mutex互斥鎖的區別
?
5、struct time_list ,LIST_HEAD(MINE) ,DECLARE_MUTEX(sem) ,spinlock_t ,atomic_t spin_unlock(&m)在哪個頭
linux驅動吧?
在linux/sem.h linux/list.h linux/spinlock.h
6、怎麼查看semtake vxworks
VxWorks的信號量機制分析
VxWorks信號量是提供任務間通信、同步和互斥的最優選擇,提供任務間最快速的通信。也是提供任務間同步和互斥的主要手段。VxWorks提供3種信號量來解決不同的問題。
二進制信號量:最快的最常用的信號量,可用於同步或互斥。
互斥信號量:為了解決內在的互斥問題如優先順序繼承、刪除安全和遞歸等情況而最優化的特殊的二進制信號量。
計數信號量:類似於二進制信號量,但是隨信號量釋放的次數改變而改變。
二進制信號量
二進制信號量能夠滿足任務間的互斥和同步,需要的系統開銷最小,因此也稱快速信號量。二進制信號量可以看成一個標志,對應資源是可用還是不可用。當一個任務調用semTake ()請求一個信號量時,如果此時信號量可用,信號量會被清零,並且任務立即繼續執行;如果信號量不可用,任務會被阻塞來等待信號量。
當一個任務調用semGive ()釋放一個二進制信號量時。如果信號量已經可用,釋放信號量不會產生任何影響;如果信號量不可用並且沒有任務等待使用該信號量,信號量只是被簡單地置為可用;如果信號量不可用並且有一個或多個任務等待該信號量,最高優先順序的任務被解阻塞,信號量仍為不可用。
互斥
當兩個以上的任務共享使用同一塊內存緩沖區或同一個I/O設備之類的資源時,可能會發生競爭狀態。
二進制信號量可以通過對共享資源上鎖,實現高效的互斥訪問,不象禁止中斷或禁止搶占,二進制信號量將互斥僅僅限於對與之聯系的資源的訪問,並且比禁止中斷和禁止搶占提供更精確的互斥粒度。使用時創建用於保護資源的二進制信號量,初始時信號量可用。
當任務需要訪問這個資源時,首先取得這個信號量,所有其它想要訪問這個資源的任務將被阻塞。當任務完成了對該資源的訪問時,釋放該信號量,允許其他任務使用該資源。因此所有對一個需要互斥訪問資源的操作由semTake ()和semGive ()對一起來實現。
semTake(semMutex,WAIT FOREVER)
臨界區,某一時刻僅被一個任務訪問
semGive (semMutex)
同步
信號量另一種通常的用法是用於任務間的同步機制。在這種情況下,信號量代表一個任務所等待的條件或事件。最初,信號量是不可用的。一個任務或中斷處理程序釋放該信號量來通知這個事件的發生。等待該信號量的任務將被阻塞直到事件發生、該信號量可用。一旦被解阻塞,任務就執行恰當的事件處理程序。信號量在任務同步中的應用對於將中斷服務程序從冗長的事件處理中解放出來以縮短中斷響應時間是很有用的。
互斥信號量
互斥信號量是一種特殊的二進制信號量,用於解決具有內在的互斥問題:優先順序繼承、刪除安全和對資源的遞歸訪問等情況。
對於一般的操作系統,一般互斥信號量就是二值信號靚量,但VxWoks中有非同尋常的意義。另外一個典型就是,Linux內核也單獨設立了互斥信號量。
互斥信號量與二進制不同點在於:
①定義一個互斥信號量時,其已經初始化完畢為可用,它僅用於互斥;
②僅能由取(semTake ())它的任務釋放,即由同一個任務申請然後使用完畢後釋放;
③因為semTake和semGive是成對出現的,因此不能在ISR 中釋放(semGive ())。
優先順序繼承
優先順序倒置發生在一個高優先順序的任務被迫等待一段不確定時間,等待一個低優先順序任務完成。VxWorks允許使用優先順序繼承演算法,在互斥信號量中使用選項SEM-INVERSION-SAFE ,將使能優先順序繼承演算法,優先順序繼承協議確保擁有資源的任務以阻塞在該資源上的所有任務中優先順序最高的任務的優先順序執行,直到它釋放所擁有的所有信號量,然後該任務返回到正常狀態。因此這個「繼承的高優先順序」任務受到不會被任何中間優先順序任務搶占的保護。
刪除安全
另一個互斥問題涉及到任務刪除。在一個受信號量保護的臨界區,經常需要保護在臨界區執行的任務不會被意外地刪除。刪除一個在臨界區執行的任務可能引起意想不到的後果,造成保護資源的信號量不可用,可能導致資源處於破壞狀態,也就導致了其他要訪問該資源的所有任務無法得到滿足。
原語taskSafe()和taskUnsafe ()提供了防止任務被意外刪除的一種方法。同時互斥信號量提供了選項SEM-DELETE-SAFE ,使用這個選項,每次調用semTake ( )時隱含地使能了taskSafe(),當每次調用semGive ()時隱含地使能了taskUnsafe ()這種方式,任務得到信號量時得到不會被刪除的保護。
遞歸資源訪問
互斥信號量能夠被遞歸地獲得。這意味著信號量能夠被一個擁有該信號量的任務在該信號量最終被釋放之前多次獲取。遞歸對於滿足一些子程序即要求能夠相互調用但是也要求互斥訪問一個資源非常有用。這種情形是可能的,因為系統需要跟蹤哪一個任務當前擁有信號量。
計數器信號量
計數器信號量是實現任務同步和互斥的另一種手段,在具體實現上有點差異。計數器信號量除了像二進制信號量那樣工作外,還保持對信號量釋放次數的跟蹤。與二進制信號量不同的時,計數型信號量每次釋放,計數器加一;每次獲取,計數器減一,當信號量減到0 時,試圖獲取該信號量的任務被阻塞。
正如二進制信號量,當計數信號量釋放時,如果有任務阻塞在該信號量阻塞隊列上,那麼任務解除阻塞;但是如果信號量釋放時,沒有任務阻塞在該信號量阻塞隊列上,那麼計數器加一。
結 論
通過對嵌入式操作系統VxWorks的多任務之間的通信機制的分析可以看出,信號量在實現多任務間的通信、同步和互斥中發揮著重要的作用。因此,深入理解和正確使用VxWorks的信號量,可以提高實時系統中多任務間通信的效率