【发布时间】:2016-02-10 01:22:11
【问题描述】:
遇到一个非常奇怪的问题,有 2 个以上的线程在等待 interprocess_condition 变量。
提升 1.60.0
- 使用 1 个线程调用 wait() 和第 2 个调用 notify_all(),一切正常。
- 当有 2 次以上调用 wait() 时,do_wait() 上的断言失败,进程退出。
Test.cpp:
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/sync/interprocess_mutex.hpp>
#include <boost/interprocess/sync/interprocess_condition.hpp>
#include <iostream>
using namespace boost::interprocess;
struct Data {
interprocess_mutex mux_;
interprocess_condition cond_;
};
int main(int argc, char *argv[]) {
if (argc > 1 && atoi(argv[1]) == 0) {
struct shm_remove {
shm_remove() { shared_memory_object::remove("MySharedMemory"); }
~shm_remove() { shared_memory_object::remove("MySharedMemory"); }
} remover;
managed_shared_memory seg(create_only, "MySharedMemory", 65536);
Data *const d = seg.construct<Data>(unique_instance)();
scoped_lock<interprocess_mutex> lock(d->mux_);
std::cout << "Waiting" << std::endl;
d->cond_.wait(lock);
} else if (argc > 1 && atoi(argv[1]) == 1) {
managed_shared_memory seg(open_only, "MySharedMemory");
std::pair<Data *, std::size_t> res = seg.find<Data>(unique_instance);
scoped_lock<interprocess_mutex> lock(res.first->mux_);
std::cout << "Waiting" << std::endl;
res.first->cond_.wait(lock);
} else {
managed_shared_memory seg(open_only, "MySharedMemory");
std::pair<Data *, std::size_t> res = seg.find<Data>(unique_instance);
scoped_lock<interprocess_mutex> lock(res.first->mux_);
std::cout << "Notifying" << std::endl;
res.first->cond_.notify_all();
}
}
编译为:
$ clang++ -I/usr/local/include test.cpp
使用 1 个 wait() 和 1 个 notify() 运行:
$ ./a.out 0&
[8] 25889
Waiting
$ ./a.out 2&
[9] 25901
Notifying
[8]- Done ./a.out 0
[9]+ Done ./a.out 2
运行 2 次等待:
$ ./a.out 0&
[8] 25986
Waiting
$ ./a.out 1&
[9] 25998
Waiting
Assertion failed: (res == 0), function do_wait, file /usr/local/include/boost/interprocess/sync/posix/condition.hpp, line 175.
在 OSX El Capitan 上测试
$ uname -a
Darwin LUS-JOHUGHES2 15.3.0 Darwin Kernel Version 15.3.0: Thu Dec 10 18:40:58 PST 2015; root:xnu-3248.30.4~1/RELEASE_X86_64 x86_64
我还在 Ubuntu Trusty 机器上尝试了上述示例,所有示例都按预期工作,这让我相信 OSX 实现存在问题。我还没有在 Windows 上尝试过。
【问题讨论】:
-
同意这看起来像是一个特定于平台的怪癖。在我的 Ubuntu 机器上,一切看起来都很好。这里是 Live On Coliru(由于 Coliru 限制,使用
managed_mapped_file)
标签: c++ multithreading boost osx-elcapitan