嵌入式課程設計實踐(五)——pthread


      本篇主要介紹,嵌入式系統下的多線程開發。多線程是個好東西,概念並不深奧,只是要把它用好,是需要好好研究學習的。

      在此課程實踐下,本也用不到線程,只是我對自己的課設有着稍高端點的設想,再加上因自身技術問題單線程下我實現不了,於是就考慮使用線程了。對於一個簡單的應用,線程的使用還是很簡單的。


多線程的簡單介紹(來自實驗指導書)

Linux系統下,啓動一個新的進程必須分配給它獨立的地址空間,建立衆多的數據表來維護它的代碼段、堆棧段和數據段,這是一種"昂貴"的多任務工作方式。而運行於一個進程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分數據,啓動一個線程所花費的空間遠遠小於啓動一個進程所花費的空間,而且,線程間彼此切換所需的時間也遠遠小於進程間切換所需要的時間。

另外線程間具有非常方便的通信機制。對不同進程來說,它們具有獨立的數據空間,要進行數據的傳遞只能通過通信的方式進行,這種方式不僅費時,而且很不方便。線程則不然,由於同一進程下的線程之間共享數據空間,所以一個線程的數據可以直接爲其它線程所用,這不僅快捷,而且方便。


線程的使用

1.創建線程,pthread_create

intpthread_create(pthread_t*thread, constpthread_attr_t*attr,

void*(*start_routine)(void*), void*arg);

若創建成功,返回0,否則返回出錯編號。


2.等待線程結束,pthread_join

intpthread_join(pthread_t thread, void **retval);


3.結束線程,pthread_exit

voidpthread_exit(void* retval);


4.互斥互鎖信號量

pthread_mutex_tmutex;

pthread_mutex_init(&mutex,NULL);

pthread_mutex_lock(&mutex);

pthread_mutex_unlock(&mutex);

用於多線程下對臨界資源的訪問,即同時僅允許單線程佔用的資源,如對同一文件的寫操作等。

更深入的內容將涉及操作系統更多的知識,在此不再多提。


多線程的簡單實例

pthreadtest.c

#include<stddef.h>

#include<stdio.h>

#include<unistd.h>

#include"pthread.h"

voidreader_function(void);

voidwriter_function(void);

charbuffer;

intbuffer_has_item=0;

pthread_mutex_tmutex;

main()

{

  pthread_treader;

  pthread_mutex_init(&mutex,NULL);

  pthread_create(&reader,NULL,(void*)&reader_function,NULL);

  writer_function();

  return0;

}

voidwriter_function(void)

{

  while(1)

  { 

    pthread_mutex_lock(&mutex);

    if(buffer_has_item==0)

    {

      buffer='s';

      fprintf(stderr,"writetest\n");

      buffer_has_item=1;

    }

    pthread_mutex_unlock(&mutex);

  }

}

voidreader_function(void)

{

  while(1)

  {

    pthread_mutex_lock(&mutex);

    if(buffer_has_item==1)

    {

      buffer='\0';

      fprintf(stderr,"readtest\n");

      buffer_has_item=0;

    }

    pthread_mutex_unlock(&mutex);

  }

}


編譯命令:gccpthreadtest.c -o pthreadtest -lpthread

forarm: arm-linux-gcc pthreadtest.c -o pthreadtest -lpthread

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章