C ++程序线程概念

时间:2013-05-09 12:12:43

标签: c++ multithreading

我正在尝试编写一个相当简单的C ++程序。这分为三部分:

  1. 串行客户端:应连续轮询串行服务器并将接收到的值保存在表中,具有无限循环以继续轮询串行服务器
  2. 日志记录:将当前表值写入带有每几秒时间戳的.csv文件
  3. 菜单:启动/停止服务器并退出程序的简单命令行菜单
  4. 我曾尝试使用pthread和boost :: thread来使这三个函数同时发生,但是没有多少运气。

    任何人都可以向我提供一些方向,我是线程新手,也许线程也不是正确的方式。

2 个答案:

答案 0 :(得分:1)

这是一种做你要问的方法:

boost::mutex mtx;

void poll_thread()
{
    while(!done) {
        poll_for_data();
        if(data_received) {
            boost::unique_lock<boost::mutex> lock(mtx);
            //write data to table
        }
    }
}

void log_thread()
{
    while(!done) {
        sleep(1);
        boost::unique_lock<boost::mutex> lock(mtx);
        //log table to csv file...
    }
}

int main()
{
    //create and start the polling and logging thread
    boost::thread th1(&poll_thread);
    boost::thread th2(&log_thread);

    //run the menu
    while(!done) {
        //...
    }

    th1.join();
    th2.join();

    return 0;
}

互斥是必要的,以避免在不同的线程中同时访问表。

答案 1 :(得分:0)

这是一个非常常见的情景。

通常,您的应用程序将有一个主线程:

  1. 设置串行连接。
  2. 驾驶菜单(用户输入等)
  3. 然后串行连接将有一个侦听线程。当在串行连接上接收数据时,它将触发将由主应用程序处理的数据接收事件。通常,您可以使用许多可用的库对象中的一个来简化串行端口通信。这样就可以完成设置和管理自己的监听线程的工作。在这种情况下,您只需将应用程序事件处理程序连接到串行端口处理程序对象DataReceived事件。在C ++世界中,最有可能的是Boost.Asio。还有一个不错的串口通信对象,这里有一篇很好的支持文章:CodeProject Serial library for C++

    如果事件处理程序(在串行侦听线程上调用)和主应用程序线程都在访问某些共享数据(您提到的数据表),那么您将需要使用同步原型(例如CriticalSection,Mutex,等)避免并发访问(一个线程(串行侦听线程)写入或添加到数据结构而另一个线程(主应用程序线程)正在读取或拉出它)。