vxWorks互斥訊號量示例
#include "vxWorks.h" #include "semLib.h" #include "taskLib.h" #include "logLib.h" #include "sysLib.h" #include "stdio.h" #define CONSUMER_TASK_PRI 98 /* Priority of the consumerTask task*/ #define PRODUCER_TASK_PRI 99 /* Priority of the producerTask task*/ #define PRODUCED 1 /* Flag to indicate produced status*/ #define CONSUMED 0 /* Flag to indicate consumed status*/ #define NUM_ITEMS 5 /* Number of items */ struct shMem /* Shared Memory data structure */ { int tid; /* task id */ int count; /* count number of item produced */ int status; /* 0 if consumed or 1 if produced*/ }; LOCAL STATUS protectSharedResource (); /* protect shared data structure */ LOCAL STATUS releaseProtectedSharedResource (); /* release protected access */ LOCAL STATUS producerTask (); /* producer task */ LOCAL STATUS consumerTask (); /* consumer task */ LOCAL struct shMem shMemResource; /* shared memory structure */ LOCAL SEM_ID mutexSemId; /* mutual exclusion semaphore id*/ LOCAL BOOL notFinished; /* Flag that indicates the * completion */ STATUS TestMSem() { notFinished = TRUE; /* initialize the global flag */ /* Create the mutual exclusion semaphore*/ if ((mutexSemId = semMCreate(SEM_Q_PRIORITY | SEM_DELETE_SAFE | SEM_INVERSION_SAFE)) == NULL) { perror ("Error in creating mutual exclusion semaphore"); return (ERROR); } /* Spwan the consumerTask task */ if (taskSpawn ("tConsumerTask", CONSUMER_TASK_PRI, 0, 5000, (FUNCPTR) consumerTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) == ERROR) { perror ("consumerTask: Error in spawning demoTask"); return (ERROR); } /* Spwan the producerTask task */ if (taskSpawn ("tProducerTask", PRODUCER_TASK_PRI, 0, 5000, (FUNCPTR) producerTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) == ERROR) { perror ("producerTask: Error in spawning demoTask"); return (ERROR); } /* Polling is not recommended. But used for making this demonstration * simple */ while (notFinished) taskDelay (sysClkRateGet ()); /* When done delete the mutual exclusion semaphore*/ if (semDelete (mutexSemId) == ERROR) { perror ("Error in deleting mutual exclusion semaphore"); return (ERROR); } return (OK); } /***************************************************************************** * producerTask - produce the message, and write the message to the global * shared data structure by obtaining exclusive access to * that structure which is shared with the consumerTask. * * RETURNS: OK or ERROR * */ STATUS producerTask () { int count = 0; int notDone = TRUE; printf("in producerTask\n"); while (notDone) { /* Produce NUM_ITEMS, write each of these items to the shared * global data structure. */ if (count < NUM_ITEMS) { /* Obtain exclusive access to the global shared data structure */ if (protectSharedResource() == ERROR) return (ERROR); /* Access and manipulate the global shared data structure */ if (shMemResource.status == CONSUMED) { count++; shMemResource.tid = taskIdSelf (); shMemResource.count = count; shMemResource.status = PRODUCED; } /* Release exclusive access to the global shared data structure */ if (releaseProtectedSharedResource () == ERROR) return (ERROR); logMsg ("ProducerTask: tid = %#x, producing item = %d\n", taskIdSelf (), count,0,0,0,0); taskDelay (sysClkRateGet()/6); /* relingiush the CPU so that * consumerTask can access the * global shared data structure. */ } else notDone = FALSE; } return (OK); } /***************************************************************************** * consumerTask - consumes the message from the global shared data * structure and updates the status filled to CONSUMED * so that producerTask can put the next produced message * in the global shared data structure. * * RETURNS: OK or ERROR * */ STATUS consumerTask () { int notDone = TRUE; printf("in consumerTask\n"); /* Initialize to consumed status */ if (protectSharedResource() == ERROR) return (ERROR); shMemResource.status = CONSUMED; if (releaseProtectedSharedResource () == ERROR) return (ERROR); while (notDone) { taskDelay (sysClkRateGet()/6); /* relingiush the CPU so that * producerTask can access the * global shared data structure. */ /* Obtain exclusive access to the global shared data structure */ if (protectSharedResource() == ERROR) return (ERROR); /* Access and manipulate the global shared data structure */ if ((shMemResource.status == PRODUCED) && (shMemResource.count > 0)) { logMsg ("ConsumerTask: Consuming item = %d from tid = %#x\n\n", shMemResource.count, shMemResource.tid,0,0,0,0); shMemResource.status = CONSUMED; } if (shMemResource.count >= NUM_ITEMS) notDone = FALSE; /* Release exclusive access to the global shared data structure */ if (releaseProtectedSharedResource () == ERROR) return (ERROR); } notFinished = FALSE; return (OK); } /***************************************************************************** * protectSharedResource - Protect access to the shared data structure with * the mutual exclusion semaphore. * * RETURNS: OK or ERROR * */ LOCAL STATUS protectSharedResource () { if (semTake (mutexSemId, WAIT_FOREVER) == ERROR) { perror ("protectSharedResource: Error in semTake"); return (ERROR); } else return (OK); } /***************************************************************************** * releaseProtectedSharedResource - Release the protected access to the * shared data structure using the mutual * exclusion semaphore * * RETURNS: OK or ERROR * */ LOCAL STATUS releaseProtectedSharedResource () { if (semGive (mutexSemId) == ERROR) { perror ("protectSharedResource: Error in semTake"); return (ERROR); } else return (OK); }
相關推薦
vxWorks互斥訊號量示例
#include "vxWorks.h" #include "semLib.h" #include "taskLib.h" #include "logLib.h" #include "sysLib.h" #include "stdio.h" #define CON
VxWorks 二進位制訊號量,互斥訊號和計數訊號量的區別
URL: http://blog.csdn.net/hxg130435477/article/details/5998006 VxWorks訊號量是提供任務間通訊、同步和互斥的最優選擇,提供任務間最快速的通訊。也是提供任務間同步和互斥的主要手段。VxWorks提供3種訊號
Python多程序,同步互斥,訊號量,鎖補充上一篇文章
from multiprocessing import Event,Process from time import sleep def wait_event1(): print("1想操作臨界區資源") e.wait() print("1開始操作臨界區資源",e.is_set()
互斥訊號量
---關鍵程式碼如下--- void CTestSemaphoreDlg::OnBnClickedButtonThread1() { // TODO: 在此新增控制元件通知處理程式程式碼 AfxBeginThread((AFX_THREADPROC)thre
uc/os-iii學習筆記-資源管理(中斷、訊號、訊號量、互斥訊號量)
資源管理 最常用的獨佔共享資源和建立臨界區的方法有以下幾種: 關、開中斷 獨佔共享資源最簡單也是最快捷的方法就是關中斷和開中斷,當訪問共享資源的速度很快,以至於訪問共享資源所花的時間小於中斷的關閉時間時,可以使用關、開中斷方法。但是不推薦此方法
UCOSIII訊號量和互斥訊號量
在UCOSIII中可能會偶多個任務會訪問共享資源,因此訊號量最早用來控制任務存取共享資源,現在訊號量也被用來實現任務間的同步以及任務和ISP同步。在可剝奪的核心中,當任務獨佔式使用共享資源的時候,會低優的任務高於高階優先任務執行的現象,這個現象叫做優先順序反轉,
FreeRTOS-互斥訊號量
原文地址:http://blog.csdn.net/xukai871105/article/details/43456985 0.前言 在嵌入式作業系統中互斥型訊號量是任務間資源保護的重要手段。下面結合一個具體例子說明FreeRTOS中的互斥型訊號量如何使用。
pthread互斥訊號量使用總結
----一年前寫的東西,重新抄錄以防遺忘。 glibc提供的pthread互斥訊號量可以用在程序內部,也可以用在程序間,可以在初始化時通過pthread_mutexattr_setpshared介面設定該訊號 量屬性,表示是程序內還是程序間。程序內的使用較為簡單,本文
ucosIII 共享資源(訊號量、互斥訊號量)
共享資源: 變數(靜態或全域性變數)、資料結構體、RAM表格、I/O裝置等。OS在使用一些資源時候,例如IO裝置印表機,當任務1在使用印表機時候必須保證資源獨享,避免其他任務修改列印內容導致出錯,因此需要有資源共享機制。 一般推薦使用互斥訊號量對共享資源實現
UCOS2:對於訊號量,互斥訊號量,事件標誌組
2.訊號量: 至於訊號量,和互斥訊號量是用區別的,簡單來說(個人理解,歡迎糾正)就是互斥訊號量再同一時刻,任務得到互斥訊號量量後是獨佔共享資源的,在他沒有釋放訊號量之前,任何其他任務都是不能訪問共享資源的。而訊號量的不同在於。訊號量可以設定一個值,允許最多又幾個任務同時去訪問共享資源。比如我給他設定一個
【UCOSIII】UCOSIII的互斥訊號量
訊號量用於控制對共享資源的保護,但是現在基本用來做任務同步用(不太清楚的可以參考連結:【UCOSIII】UCOSIII的訊號量)。優先順序反轉優先順序反轉在可剝奪核心中是非常常見的,在實時系統中不允許出現這種現象,這樣會破壞任務的預期順序,可能會導致嚴重的後果,下圖就是一個優
[領卓教育]執行緒的同步與互斥機制——訊號量
訊號量的初始化 int sem_init(sem_t *sem, int pshared, unsigned int value); 功能: 初始化訊號量 引數: sem :要是初始化的訊號量 pshared: 訊號量共享的範圍(0: 執行緒間使用 非0:程序間使用) value : 初始
作業系統 自旋鎖+訊號量+互斥量+臨界區+死鎖的區別
自旋鎖(SpinLock) 自旋鎖是專為防止多處理器併發而引入的一種鎖。如果是單核處理器,則自旋鎖定義為空操作,因為簡單的關閉中斷即可實現互斥。 自旋鎖最多隻能被一個執行緒持有,如果一個執行緒試圖請求一個已被爭用(已被另一個執行緒持有)的自旋鎖,那麼等待自旋鎖的執行緒將會反
Linux多執行緒程式設計---執行緒間同步(互斥鎖、條件變數、訊號量和讀寫鎖)
本篇博文轉自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數、訊號量和讀寫鎖。 下面是思維導
【Qt開發】QThread中的互斥、讀寫鎖、訊號量、條件變數
在gemfield的《從pthread到QThread》一文中我們瞭解了執行緒的基本使用,但是有一大部分的內容當時說要放到這片文章裡討論,那就是執行緒的同步問題。關於這個問題,gemfield在《從進 程到執行緒》中有一個比喻,有必要重新放在下面溫習下: ***************
自旋鎖、互斥體和訊號量
自旋鎖 Linux核心中最常見的鎖是自旋鎖(spin lock)。自旋鎖最多隻能被一個可執行執行緒持有。如果一個執行執行緒試圖獲得一個被已經持有的自旋鎖,那麼該執行緒就會一直進行忙迴圈——旋轉——等待鎖重新可用。要是鎖未被爭用,請求鎖的執行執行緒便能立刻得到它,繼續執行。在任意時間,自旋鎖都
使用互斥鎖mutex實現訊號量sem
/* ======================== SYNCHRONISATION ========================= */ /* Init semaphore to 1 or 0 */ void bsem_init(bsem *bsem_p, int valu
用訊號量解決程序的同步與互斥
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
執行緒(三):Lock(互斥鎖)、RLock( 遞迴鎖)、Semaphore(訊號量)、Event(事件)、Condition(條件)、Timer(定時器)、queue(佇列)
目錄 一、鎖 1)同步鎖 2)死鎖與遞迴鎖 二、訊號量 三、事件 四、條件 五、定時器 六、執行緒佇列 一、鎖 1)同步鎖 #同步鎖的引用 from threading import Thread,Lock import os,time def wor
執行緒同步:互斥鎖,訊號量
同步概念: 當多個執行緒共享相同的一塊記憶體時(實際上在一個程序的各個執行緒之間,除了棧區的資料之外,其他的資料這幾個縣城之間都是相互共享的),需要確保每個執行緒看到一致的資料檢視。也就是說,這些執行緒在對資料進行操作時,應該是同步的,也就是說當一個執行緒正在操作一個數據時,其他執行緒無法同時對