信號量的解釋: 來自百度百科: 信號量(Semaphore),有時被稱為信號燈,是在多線程環(huán)境下使用的一種設施,是可以用來保證兩個或多個關鍵代碼段不被并發(fā)調(diào)用。在進入一個關鍵代碼段之前,線程必須獲取一個信號量;一旦該關鍵代碼段完成了,那么該線程必須釋放
信號量的解釋:
來自百度百科:
信號量(Semaphore),有時被稱為信號燈,是在多線程環(huán)境下使用的一種設施,是可以用來保證兩個或多個關鍵代碼段不被并發(fā)調(diào)用。在進入一個關鍵代碼段之前,線程必須獲取一個信號量;一旦該關鍵代碼段完成了,那么該線程必須釋放信號量。
RT-Thread 的信號量有靜態(tài)和動態(tài),這里同線程的靜態(tài)和動態(tài)是一個意思。對信號量有兩種操作,take 和 release。
程序中,首先初始化信號量為0,這時首先使用take,并只等待10個tick,故一定會超時,因為信號量初始值為0,take不到。然后release一次,信號量便增加1,這時再次take,并且使用的是wait forever 的方式,便一定能得到信號量。
程序:
#includestatic struct rt_semaphore static_sem; static rt_sem_t dynamic_sem = RT_NULL; static rt_uint8_t thread1_stack[1024]; struct rt_thread thread1; static void rt_thread_entry1(void *parameter) { rt_err_t result; rt_tick_t tick; /* static semaphore demo */ tick = rt_tick_get(); /* try to take the sem, wait 10 ticks */ result = rt_sem_take(&static_sem, 10); if (result == -RT_ETIMEOUT) { if (rt_tick_get() - tick != 10) { rt_sem_detach(&static_sem); return ; } rt_kprintf("take semaphore timeout\n"); } else { rt_kprintf("take a static semaphore, failed.\n"); rt_sem_detach(&static_sem); return ; } /* release the semaphore */ rt_sem_release(&static_sem); /* wait the semaphore forever */ result = rt_sem_take(&static_sem, RT_WAITING_FOREVER); if (result != RT_EOK) { rt_kprintf("take a static semaphore, failed.\n"); rt_sem_detach(&static_sem); return ; } rt_kprintf("take a static semaphore, done.\n"); /* detach the semaphore object */ rt_sem_detach(&static_sem); //} /* dynamic thread pointer */ //static void thread2_entry(void *parameter) //{ // rt_err_t result; // rt_tick_t tick; tick = rt_tick_get(); /* try to take the semaphore, wait for 10 ticks */ result = rt_sem_take(dynamic_sem, 10); if (result == -RT_ETIMEOUT) { if (rt_tick_get() - tick != 10) { rt_sem_delete(dynamic_sem); return ; } rt_kprintf("take semaphore timeout\n"); } else { rt_kprintf("take a dynamic semaphore, failed.\n"); rt_sem_delete(dynamic_sem); return ; } /* release the dynamic semaphore */ rt_sem_release(dynamic_sem); /* wait forever */ result = rt_sem_take(dynamic_sem, RT_WAITING_FOREVER); if (result != RT_EOK) { rt_kprintf("take a dynamic semaphore, failed.\n"); rt_sem_delete(dynamic_sem); return ; } rt_kprintf("take a dynamic semaphore, done.\n"); /* delete the semaphore*/ rt_sem_delete(dynamic_sem); } //static rt_thread_t tid = RT_NULL; int rt_application_init() { rt_err_t result; result = rt_sem_init(&static_sem, "ssem", 0, RT_IPC_FLAG_FIFO); if (result != RT_EOK) { rt_kprintf("init static semaphore failed. \n"); return -1; } dynamic_sem = rt_sem_create("dsem", 0, RT_IPC_FLAG_FIFO); if (dynamic_sem == RT_NULL) { rt_kprintf("create dynamic semaphore failed. \n"); return -1; } /* thread1 init */ rt_thread_init(&thread1, "t1", rt_thread_entry1, RT_NULL, &thread1_stack[0], sizeof(thread1_stack), 11, 5 ); rt_thread_startup(&thread1); return 0; }
take semaphore timeout take a staic semaphore, done. take semaphore timeout take a dynamic semaphore, done.
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com