最近在實習的公司做乙個ros系統,有個部分需要控制電機,以及分析電機碼盤給上來的資料,用的是串列埠通訊。
由於碼盤給上來的資料時間是不固定的,下放命令的時間也是不固定的,所以只能做成非同步通訊的形式。所以就需要用到多執行緒程式設計了。
程式語言是c,但由於另乙個部分是企業提供的,c++形式,用到了很多類,所以這裡編譯用的是g++
這篇部落格裡寫的只是個demo,實現了執行緒的功能,加上串列埠通訊的在
下面這個**本來是另乙個實習生在網上找來的,但是他說跑起來有亂碼的現象。我把**拿過來之後連編譯都過不去,後來搞了好幾個小時才搞通,順便找到了亂碼的原因,也是有點坑在裡面的,所以特地記錄下來。
太長不看的同學可以直接copy下面的**,親測能跑
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define max 2
pthread_t thread[2];
pthread_mutex_t mut;
int fd;
int set_port(int fd,int nbits)
bzero(&newtio,sizeof(newtio)); //清零
newtio.c_cflag |=clocal|cread;//用於本地連線和接收使能
newtio.c_cflag &=~csize;//設定資料位
switch(nbits)
//設定奇校驗位
newtio.c_cflag |=parenb;
//設定波特率
cfsetispeed(&newtio,b115200);
cfsetospeed(&newtio,b115200);
//設定停止位
newtio.c_cflag &=~parenb;
if((tcsetattr(fd,tcsanow,&newtio))!=0)
printf("mistakes over \n");
return
0; }
void *thread1(void*)
else
if(i==1)
sleep(1);
pthread_mutex_unlock(&mut);
}printf("thread1 stop\n");
pthread_exit(null);
}void *thread2(void*)
; for (j = 0; j< max; j++)
printf("thread2 stop\n");
pthread_exit(null);
}void thread_create(void)
void thread_wait(void)
if(thread[1] !=0)
}int main(void)
pthread_mutex_init(&mut,null);
printf("creat preadth\n");
thread_create();
printf("program on..... \n");
while(1);
thread_wait();
close(fd);
}return
0;}
終端編譯命令
$ g++ main.cpp -o thread_test -lpthread
執行命令
./thread_test
先看下全域性變數
然後看 main 函式
set_port 函式沒什麼好說的,跟執行緒沒關係,不做解釋了。
pthread_mutex_init 的用法也很固定,沒有坑。
thread_create 是自己寫的函式
void thread_create(void)
最重要的是執行緒函式的函式頭
void *thread1(void*)
編譯的時候也有個大坑
$ g++ main.cpp -o thread_test -lpthread
-lpthread必須要加上,否則會報 函式未定義 錯誤。
原因是,pthread_create函式不在linux預設的庫,編譯的時候需要鏈結其所在的靜態庫,也就是加上這句話。
其他的一些坑:
Linux 多執行緒程式設計
1.建立執行緒和退出的函式原型 int pthread create pthread t thread,pthread attr t attr,void start routine void void arg pthread exit 0 其他還有很多相關的函式。2.編譯時要加上 lpthread ...
Linux多執行緒程式設計
linux 多執行緒程式設計 多執行緒支援 posix 執行緒介面,稱為 pthread,pthread create 用來建立執行緒,pthread join 等待執行緒結束,函式的原型分別如下 extern int pthread create p pthread t thread,const ...
linux 多執行緒程式設計
多執行緒的使用 典型的執行緒包括乙個執行時間系統,它可以按透明的方式來管理執行緒。通常執行緒包包括對執行緒的建立和刪除,以及對互斥和條件變數的呼叫。posix標準執行緒庫具有這些呼叫。這些包還提供執行緒的動態建立和刪除,因此,直到執行時間之前,執行緒的個數不必知道。執行緒具有乙個id 乙個堆疊 乙個...