1 多執行緒同步

eCos是一個多執行緒系統,為保證多個執行緒之間能夠協同工作和它們對資源的合理競爭,必須提供一種執行緒之間的同步和通信機制,稱為同步原語。

2 互斥體

互斥體(Mutexes) 被設計用來使多個執行緒能夠安全的存取共用資源。如果兩個或兩個以上的執行緒要對同一個共用資源進行操作而沒有對它進行鎖定,系統可能在當時不會出現什麼 問題,但是不久以後共用資源將會變得不一致,應用程式可能會出現異常並最終導致系統崩潰。這種現象也可能出現在使用單個變數或其他資源的時候。

//=\=============================================

//程式功能 :

//          觀察AB兩個同優先順序級別的執行緒共用一個陣列

//          在使用互斥鎖或不用互斥鎖時的輸出結果

//===============================================

#include <cyg/hal/hal_arch.h>       // CYGNUM_HAL_STACK_SIZE_TYPICAL

#include <cyg/kernel/kapi.h>

#include <stdio.h>

//#define USE_MUTEX                // 使用或註解此行觀察串列埠輸出訊息的不同

#ifdef USE_MUTEX

cyg_mutex_t ProtectShareSpace;     // 宣告一個互斥體ProtectShareSpace

#endif

char ShareMemorySpace[22];

cyg_uint32 WritePointer;

//====================================================

// 語法格式:void ThreadA(cyg_addrword_t data)

// 功能描述: 主執行緒

//====================================================

void ThreadA(cyg_addrword_t data)

{

        while(1)

        {

#ifdef USE_MUTEX

                cyg_mutex_lock(&ProtectShareSpace);

#endif

                WritePointer = 0;

                for(; WritePointer < 20; WritePointer++)

                {

                      ShareMemorySpace[WritePointer] = 'A';

                      cyg_thread_delay(1);

                }

                ShareMemorySpace[WritePointer] = '\n';

                ShareMemorySpace[WritePointer + 1] = '\0';

#ifdef USE_MUTEX

                cyg_mutex_unlock(&ProtectShareSpace);

#endif

                printf(ShareMemorySpace);

                printf("\n");

                cyg_thread_delay(100);

        }

}

//====================================================

// 語法格式:void ThreadB(cyg_addrword_t data)

// 功能描述: 主執行緒

//====================================================

void ThreadB(cyg_addrword_t data)

{

        while(1)

        {

#ifdef USE_MUTEX

                cyg_mutex_lock(&ProtectShareSpace);

#endif

                WritePointer = 0;

                for(; WritePointer < 20; WritePointer++)

                {

                        ShareMemorySpace[WritePointer] = 'B';

                        cyg_thread_delay(1);

                }

                ShareMemorySpace[WritePointer] = '\n';

                ShareMemorySpace[WritePointer + 1] = '\0';

#ifdef USE_MUTEX

                cyg_mutex_unlock(&ProtectShareSpace);

#endif

               printf(ShareMemorySpace);

                printf("\n");

                cyg_thread_delay(20);

        }

}

#define STACK_SIZE CYGNUM_HAL_STACK_SIZE_TYPICAL

cyg_uint8 stack[2][STACK_SIZE];

cyg_handle_t h_Thread[2];

cyg_thread Thread_s[2];

//====================================================

// 語法格式:void cyg_user_start(void)

// 功能描述: 主函數

//====================================================

void cyg_user_start(void)

{

#ifdef USE_MUTEX    //註

        cyg_mutex_init(&ProtectShareSpace);    //互斥體初始化

#endif

         // 創建執行緒A

        cyg_thread_create(4,                    // 執行緒優先級

                          ThreadA,                  // 執行緒函數名

                          (cyg_addrword_t)0,    // 執行緒參數

                          "Thread A",              // 執行緒名稱

                          (void *)stack[0],        // 執行緒堆疊

                          STACK_SIZE,           // 執行緒堆疊大小

                          &h_Thread[0],          // 返回執行緒控制碼

                          &Thread_s[0]);         // 執行緒信息結構體  

          // 創建執行緒B

        cyg_thread_create(4,                     // 執行緒優先級

                          ThreadB,                   // 執行緒函數名

                          (cyg_addrword_t)0,     // 執行緒參數

                          "Thread B",               // 執行緒名稱

                          (void *)stack[1],        // 執行緒堆疊

                           STACK_SIZE,          // 執行緒堆疊大小

                           &h_Thread[1],         // 返回執行緒控制碼

                           &Thread_s[1]);        // 執行緒信息結構體

        cyg_thread_resume(h_Thread[0]);                 // 啟動執行緒A

        cyg_thread_resume(h_Thread[1]);                 // 啟動執行緒B

    return;

}

執行結果 :

(使用互斥鎖)

(不使用互斥鎖)

PS :

/*#define TURBOC
 
int main()
{
  #ifdef TURBOC (因為上頭有定義TURBOC所以此條件成立)
    printf("Borland C compiler.\n");
  #endif (結束#ifdef)
 
  #undef TURBOC (消除TURBOC定義)
 
  #ifndef TURBOC (因為TURBOC沒被定義所以此條件成立)
    printf("MircoSoft C compiler.\n");
  #endif (結束#ifdef)
}

執行結果 :
Borland C compiler.
MircoSoft C compiler.*/

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 pixnote21 的頭像
    pixnote21

    pixnote21的隨手筆記

    pixnote21 發表在 痞客邦 留言(0) 人氣()