线程间同步无过载
Posted
技术标签:
【中文标题】线程间同步无过载【英文标题】:Synchronization between threads without overload 【发布时间】:2014-06-16 21:17:39 【问题描述】:对于如何在不同线程之间的公共资源上实现良好的互斥,我找不到一个好的解决方案。
我有很多方法(来自一个类)可以对数据库进行大量访问,这是其中之一
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();
方法等待和信号做这些事情:
void Database::wait(void)
while(!this->semaphore);
this->semaphore = false;
void Database::signal(void)
this->semaphore = true;
但在这种情况下,我的 CPU 使用率超过 190%(从 /proc/loadavg 读取)。我应该怎么做才能减少 CPU 过载,让系统更高效?我在 800MHz RaspberryPi 上
【问题讨论】:
不要“实现”你自己的信号量。请改用操作系统服务。您不能自己实现“睡眠”,因为您的程序永远不会不做任何事情。您需要与操作系统调度程序进行交互才能有效地睡眠。 你有什么建议? 你可以在构造函数中使用pthread_mutex_t
init,等待锁定,信号解锁,析构函数销毁。或看这里:sourceware.org/pthreads-win32/manual/pthread_mutex_init.html
正是我所说的。使用操作系统服务。
我想你想用std::lock_guard<std::mutex> lock(my_mutex);
【参考方案1】:
您可以在构造函数中使用pthread_mutex_t
init,为等待锁定,为信号解锁,在析构函数中销毁。
像这样:
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 表示成功,非零表示错误。
【讨论】:
用C++11,可以用std::mutex
,看来OP可能用RAII,所以另外用std::lock_guard
以上是关于线程间同步无过载的主要内容,如果未能解决你的问题,请参考以下文章