线程间同步无过载

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

以上是关于线程间同步无过载的主要内容,如果未能解决你的问题,请参考以下文章

RTOS基础之线程间同步

Java并发:线程间同步-条件队列和同步工具类

线程间的通信同步方式与进程间通信方式

线程同步,线程间的通信

操作系统之进程同步

线程间的通信同步方式与进程间通信方式