树莓派cpu检测_【树莓派3B+测评】线程的挂起与恢复CPU温度检测
【樹莓派3B+測評】線程的掛起與恢復&CPU溫度檢測
[復制鏈接]
本帖最后由 donatello1996 于 2018-12-22 17:33 編輯
在TCP通信中,除了線程的創建和刪除以外,掛起和解掛也是非常重要的步驟,簡單而言,掛起線程就是讓該線程暫停執行,一直在阻塞,而解掛線程(恢復)就顧名思義了,解除掛起狀態繼續運行,這里我再開辟一個線程用于循環檢測CPU溫度,一秒檢測一次,以確保系統在正常運作。讀取溫度的方法是讀取/sys/class/thermal/thermal_zone0/temp文件的數值,將數值傳輸到標準文件流,再通過printf終端輸出:
#define TEMP_PATH "/sys/class/thermal/thermal_zone0/temp"
int fd;
char buf[30];
fd = open(TEMP_PATH, O_RDONLY);
read(fd, buf, 30);
然后是線程的創建,除了之前的創建線程本身以外,還要創建互斥鎖和cond:
pthread_create(&id2,NULL,Thread_CPU_Temp,NULL);
printf("CPU溫度檢測線程建立\n");
if (pthread_mutex_init(&mut,NULL))
{
printf("互斥鎖初始化失敗\n");
}
if (pthread_cond_init(&cond,NULL))
{
printf("cond初始化失敗\n");
}
掛起和解掛其實就是對鎖和cond信號量的操作:
void thread_resume()
{
if (status == STOP)
{
pthread_mutex_lock(&mut);
status = RUN;
pthread_cond_signal(&cond);
printf("CPU溫度檢測線程恢復運行\n");
pthread_mutex_unlock(&mut);
}
else
{
printf("CPU溫度檢測線程一直在運行\n");
}
}
void thread_pause()
{
if (status == RUN)
{
pthread_mutex_lock(&mut);
status = STOP;
printf("CPU溫度檢測線程暫停(掛起)\n");
pthread_mutex_unlock(&mut);
}
else
{
printf("CPU溫度檢測線程一直在暫停\n");
}
}
操作cond信號量的時候必須鎖上線程的共享資源,如果該線程掛起了,那么這個線程就一直阻塞而不執行任何操作,Linux系統在輪轉執行到此線程
時間片的時候會自動跳過此線程。
完整代碼如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "raspi_led_pwm.h"
int fd_socket;
pthread_t id1,id2;
#define RUN??1
#define STOP 0
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
unsigned char sendbuf[100],recvbuf[100];
int thread_flag=0,status=STOP;
#define TEMP_PATH "/sys/class/thermal/thermal_zone0/temp"
void *Thread_CPU_Temp(void *arg)
{
int fd;
double temp = 0;
char buf[30];
while(1)
{
pthread_mutex_lock(&mut);
while(!status)
{
pthread_cond_wait(&cond, &mut);
}
pthread_mutex_unlock(&mut);
fd = open(TEMP_PATH, O_RDONLY);
if (fd < 0)
{
fprintf(stderr, "無法打開thermal_zone0/temp文件\n");
return -1;
}
if (read(fd, buf, 30) < 0)
{
fprintf(stderr, "讀取溫度數據失敗\n");
return -1;
}
temp = atoi(buf) / 1000.0;
printf("%.2f\n", temp);
sleep(1);
}
}
void thread_resume()
{
if (status == STOP)
{
pthread_mutex_lock(&mut);
status = RUN;
pthread_cond_signal(&cond);
printf("CPU溫度檢測線程恢復運行\n");
pthread_mutex_unlock(&mut);
}
else
{
printf("CPU溫度檢測線程一直在運行\n");
}
}
void thread_pause()
{
if (status == RUN)
{
pthread_mutex_lock(&mut);
status = STOP;
printf("CPU溫度檢測線程暫停(掛起)\n");
pthread_mutex_unlock(&mut);
}
else
{
printf("CPU溫度檢測線程一直在暫停\n");
}
}
void *Thread_Send_buf(void *arg)
{
int len;
while(1)
{
bzero(sendbuf,100);
scanf("%s",sendbuf);
if(sendbuf[0]=='1')
{
if(thread_flag==0)
{
thread_flag=1;
pthread_create(&id2,NULL,Thread_CPU_Temp,NULL);
printf("CPU溫度檢測線程建立并處于阻塞狀態\n");
if (pthread_mutex_init(&mut,NULL))
{
printf("互斥鎖初始化失敗\n");
}
if (pthread_cond_init(&cond,NULL))
{
printf("cond初始化失敗\n");
}
}
}
else if(sendbuf[0]=='2')
{
thread_pause();
}
else if(sendbuf[0]=='3')
{
thread_resume();
}
for(len=0;sendbuf[len]!='\0';len++);
send(fd_socket,sendbuf,len,0);
}
}
int main()
{
int i=0;
int ret=-1;
wiringPiSetup();
//Raspi_LED_Init();
//Raspi_PWM_Init(100);
//pwmWrite(1,60);
/*
struct sockaddr_in sockaddr_in_comm,sockaddr_in_settings;
bzero(&sockaddr_in_settings,sizeof(sockaddr_in_settings));
sockaddr_in_settings.sin_family=AF_INET;
sockaddr_in_settings.sin_addr.s_addr=inet_addr("169.254.122.5");
sockaddr_in_settings.sin_port=htons(8087);
*/
socklen_t addrsize=sizeof(struct sockaddr);
struct sockaddr_in girladdr;
bzero(&girladdr,sizeof(girladdr)); // 清零
girladdr.sin_family=AF_INET;
girladdr.sin_port=htons(10086);
girladdr.sin_addr.s_addr=inet_addr("169.254.122.1");
int thread_1=0;
while(1)
{
while(1)
{
fd_socket=socket(AF_INET,SOCK_STREAM,0);
if(fd_socket==-1)
{
printf("套接字初始化失敗!\n");
return -1;
}
ret=connect(fd_socket,(struct sockaddr *)&girladdr,addrsize);
if(ret==0)
{
printf("與服務器建立連接\n");
ret=pthread_create(&id1,NULL,Thread_Send_buf,NULL);
if(ret==0)
printf("TCP發送阻塞線程被創建\n");
break;
}
}
while(1)
{
bzero(recvbuf,100);
ret=recv(fd_socket,recvbuf,100,0);
if(ret==0)
{
printf("與服務器失去連接\n");
ret=pthread_cancel(id1);
if(ret==0)
printf("TCP發送阻塞線程被取消\n");
break;
}
printf("服務器端發來信息:%s\n",recvbuf);
}
}
}
看看效果,當輸入1的時候,創建CPU溫度檢測線程,輸入2的時候,線程掛起,輸入3的時候線程恢復運行:
42.jpg (65.84 KB, 下載次數: 0)
2018-12-22 17:33 上傳
43.jpg (68.92 KB, 下載次數: 0)
2018-12-22 17:33 上傳
44.jpg (71.34 KB, 下載次數: 0)
2018-12-22 17:33 上傳
45.jpg (126.63 KB, 下載次數: 0)
2018-12-22 17:33 上傳
46.jpg (112.72 KB, 下載次數: 0)
2018-12-22 17:33 上傳
總結
以上是生活随笔為你收集整理的树莓派cpu检测_【树莓派3B+测评】线程的挂起与恢复CPU温度检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac系统装mysql还是mariadb
- 下一篇: java格式_java时间格式转换大全