我找不到如何在不同线程之间的公共资源上实现良好互斥的良好解决方案。
我有很多方法(来自一个类),它们可以访问很多数据库,这是其中之一
string id = QUERYPHYSICAL + toString(ID);
wait();
mysql_query(connection, id.c_str());
MYSQL_RES *result = mysql_use_result(connection);
while (MYSQL_ROW row = mysql_fetch_row(result)){
Physical[ID - 1].ID = atoi(row[0]);
Physical[ID - 1].NAME = row[1];
Physical[ID - 1].PEOPLE = atoi(row[2]);
Physical[ID - 1].PIRSTATUS = atoi(row[3]);
Physical[ID - 1].LIGHTSTATUS = atoi(row[4]);
}
mysql_free_result(result);
signal();
方法wait和signal做这些事情:
void Database::wait(void) {
while(!this->semaphore);
this->semaphore = false;
}
void Database::signal(void) {
this->semaphore = true;
}
但在这种情况下,我的CPU使用率超过190%(从/ proc / loadavg读取)。我该怎么做才能减少CPU过载并让系统更高效?我正在使用800MHz的RaspberryPi
答案 0 :(得分:0)
你可以在构造函数中使用pthread_mutex_t
init,在等待时锁定,解锁信号,在析构函数中使用destroy。
class Mutex{
pthread_mutex_t m;
public:
Mutex(){
pthread_mutex_init(&m,NULL);
}
~Mutex(){
pthread_mutex_destroy(&m);
}
void wait() {
pthread_mutex_lock(&m);
}
void signal() {
pthread_mutex_unlock(&m);
}
} ;
您还应该检查pthread_mutex
函数的返回值:0表示成功,非零表示错误。