時間片輪轉調度是多個相同優先級線程進行線程調度的主要方式。
所謂時間片輪轉,就是每個線程僅在屬於自己的時間片內處於運行態,時間片超出時,系統調度器依次運行接下來的任務,類似於音樂播放器的列表順序播放模式。
創建兩個動態任務,注意句柄和入口函數的使用!
/* 優先級、線程棧、時間片 */
#define THREAD_STACK_SIZE 1024
#define THREAD_PRIORITY 20
#define THREAD_TIMESLICE 10
/* 線程入口 */
static void thread_entry(void* parameter)
{
rt_uint32_t value;
rt_uint32_t count = 0;
value = (rt_uint32_t)parameter;
while (1)
{
if(0 == (count % 5))
{
rt_kprintf("thread %d is running ,thread %d count = %d\n", value , value , count);
if(count> 200)
return;
}
count++;
}
}
int timeslice_sample(void)
{
/* 注意!此處使用同一個句柄、入口函數,僅在入口函數的參數有所不同 */
rt_thread_t tid = RT_NULL;
/* 創建線程 1 */
tid = rt_thread_create("thread1",
thread_entry, (void*)1,
THREAD_STACK_SIZE,
THREAD_PRIORITY, THREAD_TIMESLICE);
if (tid != RT_NULL)
rt_thread_startup(tid);
/* 創建線程 2 */
tid = rt_thread_create("thread2",
thread_entry, (void*)2,
THREAD_STACK_SIZE,
THREAD_PRIORITY, THREAD_TIMESLICE-5);
if (tid != RT_NULL)
rt_thread_startup(tid);
return 0;
}
/* 導出到 msh 命令列表中 */
MSH_CMD_EXPORT(timeslice_sample, timeslice sample);
由此可見,生成不同的動態任務,主體部分區別僅在 rt_thread_create() 函數體內,與句柄無關。