gpt4 book ai didi

c++ - 当一个线程向 boost::asio::io_service 添加计时器而另一个线程同时运行 io_service::run 时,它是否线程安全?

转载 作者:太空狗 更新时间:2023-10-29 21:48:46 26 4
gpt4 key购买 nike

长话短说,我的代码:

#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) ..等等吗?

最佳答案

直接回答您的问题,是的,io_service 的实例是线程安全的。这在 documentation 中有描述。 .

Thread Safety

Distinct objects: Safe.

Shared objects: Safe, with the specific exceptions of the reset() and notify_fork() functions. Calling reset() while there are unfinished run(), run_one(), poll() or poll_one() calls results in undefined behaviour. The notify_fork() function should not be called while any io_service function, or any function on an I/O object that is associated with the io_service, is being called in another thread.

不过,我不清楚您要完成的任务。正如所写,您的示例没有完成任何事情,因为当您调用 io_service::run()io_service 没有任何工作要做,因此它会立即返回。你忽略了 return value ,我怀疑如果你检查它,它会是零。

您对互斥锁的使用也有问题。通常,如果您需要从异步处理程序中访问共享资源,则更喜欢使用 strand而不是互斥量。这个概念在 Asio 示例和 documentation 中得到了很好的讨论。 , 因为是使用 threads .

关于c++ - 当一个线程向 boost::asio::io_service 添加计时器而另一个线程同时运行 io_service::run 时,它是否线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10051330/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com