3

长话短说,我的代码:

#include <iostream>
#include <map>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

namespace ba = boost::asio;
namespace bp = boost::posix_time;

typedef std::map<int, ba::deadline_timer*> timer_map;

timer_map g_timers;
boost::mutex g_timers_lock;

ba::io_service g_ios;

void on_timer(int id) {
    {
            boost::mutex::scoped_lock lock(g_timers_lock);
            timer_map::iterator it = g_timers.find(id);
            assert(it != g_timers.end());
            g_timers.erase(id);
    }

    // std::cout << "delete timer " << id << std::endl;
}

int main(void) {
    boost::thread trd(boost::bind(&ba::io_service::run, &g_ios));
    trd.detach();

    int count = 0;
    for (;;) {
            for (int i = 0; i < 100; i++) {
                    ba::deadline_timer* pt = new ba::deadline_timer(g_ios, bp::seconds(1));
                    pt->async_wait(boost::bind(&on_timer, count));

                    boost::mutex::scoped_lock lock(g_timers_lock);
                    g_timers.insert(std::make_pair(count++, pt));
            }

            usleep(20000);
    }

    return 0;
}

====================================

我知道,我应该锁定 g_timers,但我应该锁定 g_ios 吗?我的意思是这些行:

ba::deadline_timer* pt = new ba::deadline_timer(g_ios, bp::seconds(1));
pt->async_wait(boost::bind(&on_timer, count));

线程安全吗?它引用了 g_ios,它会调用 g_ios.add_job(this_timer) ..etc 吗?

4

1 回答 1

2

直接回答你的问题,是的,一个实例io_service是线程安全的。这在文档中有所描述。

线程安全

不同的物体:安全。

共享对象:安全,除了reset()notify_fork()函数。在有 unfinished 、 或 调用时调用 reset() 会 run()导致未定义run_one()的行为。在另一个线程中调用任何函数或与 关联的 I/O 对象上的任何函数时,不应调用该 函数。poll()poll_one()notify_fork()io_serviceio_service

不过,对我来说,您要完成的工作并不明显。如所写,您的示例什么也没做,因为io_service在您调用时没有任何工作要做,io_service::run()因此它立即返回。您忽略了返回值,我怀疑如果您检查它,它将为零。

您对互斥锁的使用也值得怀疑。通常,如果您需要从异步处理程序中访问共享资源,则更喜欢使用而不是互斥锁。这个概念在 Asio 示例和文档中得到了很好的讨论,线程的使用也是如此。

于 2012-04-11T03:50:43.230 回答