本篇主要介紹,嵌入式系統下的多線程開發。多線程是個好東西,概念並不深奧,只是要把它用好,是需要好好研究學習的。
在此課程實踐下,本也用不到線程,只是我對自己的課設有着稍高端點的設想,再加上因自身技術問題單線程下我實現不了,於是就考慮使用線程了。對於一個簡單的應用,線程的使用還是很簡單的。
多線程的簡單介紹(來自實驗指導書)
在Linux系統下,啓動一個新的進程必須分配給它獨立的地址空間,建立衆多的數據表來維護它的代碼段、堆棧段和數據段,這是一種"昂貴"的多任務工作方式。而運行於一個進程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分數據,啓動一個線程所花費的空間遠遠小於啓動一個進程所花費的空間,而且,線程間彼此切換所需的時間也遠遠小於進程間切換所需要的時間。
另外線程間具有非常方便的通信機制。對不同進程來說,它們具有獨立的數據空間,要進行數據的傳遞只能通過通信的方式進行,這種方式不僅費時,而且很不方便。線程則不然,由於同一進程下的線程之間共享數據空間,所以一個線程的數據可以直接爲其它線程所用,這不僅快捷,而且方便。
線程的使用
1.創建線程,pthread_create
int
pthread_create(pthread_t*thread, const
pthread_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