程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 線程優先級搶占實驗【RT-Thread學習筆記 3】,rt-thread學習筆記

線程優先級搶占實驗【RT-Thread學習筆記 3】,rt-thread學習筆記

編輯:關於C語言

線程優先級搶占實驗【RT-Thread學習筆記 3】,rt-thread學習筆記


同時處於就緒狀態的線程,優先級高的先執行。

高優先級就緒時,低優先級任務讓出CPU,讓高優先級任務先執行。

創建兩個任務函數:

//線程優先級搶占
void thread1_entry(void *parameter)
{
    rt_uint32_t count = 0;
    while(1)
    {
        for(;;count++)
        {
            rt_thread_delay(3*RT_TICK_PER_SECOND); //等三秒輸出一次
            rt_kprintf("count = %d\n",count);
        }
    }
}
void thread2_entry(void *parameter)
{
    rt_tick_t tick;
    rt_uint32_t i = 0;
    for(i = 0;;i++)
    {
        tick = rt_tick_get();
        rt_thread_delay(RT_TICK_PER_SECOND);  //等疫苗輸出一次
        rt_kprintf("tick = %d\n",tick);
    }
}

啟動他們:

void rt_thread_test(void)
{
    //線程搶占實驗
    result= rt_thread_init(&thread1,"thread1",thread1_entry,RT_NULL,thread1_stack,512,10,10);
    if(result == RT_EOK)
    {
        rt_thread_startup(&thread1);        
    }
    
    if(RT_EOK == rt_thread_init(&thread2,"thread2",thread2_entry,RT_NULL,thread2_stack,512,10,10))
    {
        rt_thread_startup(&thread2);
    }
}

因為更高的優先級,thread1率先得到執行,隨後它調用延時,時間為3個系統tick,於是thread2得到執行。可以從打印結果中發現一個規律, 在第一次thread2了打印兩次thread1會打印一次之後,接下來的話thread2每打印三次thread1會打印一次。對兩個線程的入口程序進 行分析可以發現,在thread1 3個系統tick的延時裡,thread2實際會得到三次執行機會,但顯然在thread1的第一個延時內thread2第三次執行並沒有執行結束,在第 三次延時結束以後,thread2本應該執行第三次打印計數的,但是由於thread1此時的延時也結束了,而其優先級相比thread2要高,所以搶占 了thread2的執行而開始執行。當thread1再次進入延時時,之前被搶占的thread2的打印得以繼續,然後在經過兩次1個系統tick延時和 兩次打印計數後,在第三次系統tick結束後又遇到了thread1的延時結束,thread1再次搶占獲得執行,所以在這次thread1打印之 前,thread2執行了三次打印計數。

java多線程的問題?-函數Threadsleep(3);

同時多線程Simultaneous multithreading,簡稱SMT。SMT可通過復制處理器上的結構狀態,讓同一個處理器上的多個線程同步執行並共享處理器的執行資源,可最大限度地實現寬發射、亂序的超標量處理,提高處理器運算部件的利用率,緩和由於數據相關或Cache未命中帶來的訪問內存延時。當沒有多個線程可用時,SMT處理器幾乎和傳統的寬發射超標量處理器一樣。SMT最具吸引力的是只需小規模改變處理器核心的設計,幾乎不用增加額外的成本就可以顯著地提升效能。多線程技術則可以為高速的運算核心准備更多的待處理數據,減少運算核心的閒置時間。這對於桌面低端系統來說無疑十分具有吸引力。Intel從3.06GHz Pentium 4開始,所有處理器都將支持SMT技術。
 

C++數據類型轉換 創建線程時,CreateThread參數3我要傳遞一個CString類型指針,CString怎轉成LPVOID

我覺得你的算法的問題在於
主線程在CreateThread後退出了函數,使得CString str被析構,這時創建的子線程再去取lpParameter的時候就無法取到正確的值
建議使用全局對象或者在堆上動態生成對象
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved