gpt4 book ai didi

c++ - 函数指针是否在进程间保持有效?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:53 24 4
gpt4 key购买 nike

我编写了一个扩展模块,它使用 C++ 函数指针来存储函数调用序列。我想使用 python 的 multiprocessing 模块在单独的进程中“运行”这些调用序列(没有共享状态,所以没有同步问题)。

我需要知道函数指针(不是数据指针)在 multiprocessing 执行 fork() 后是否仍然有效。

C++ 模块:

#include <list>
#include <boost/assert.hpp>
#include <boost/python.hpp>
#include <boost/python/stl_iterator.hpp>
#include <boost/foreach.hpp>

/*
* Some functions to be called
*/
double funcA(double d) { return d; }
double funcB(double d) { return d + 3.14; }
double funcC(double d) { return d - 42.0; }

/*
* My container of function pointers (picklable to allow use with multiprocessing)
*/
typedef double(*func_ptr_t)(double);
struct CallSequence {
CallSequence() {
_seq.push_back(funcA);
_seq.push_back(funcB);
_seq.push_back(funcC);
}

std::list<func_ptr_t> _seq;
};

template <typename cast_type>
struct CallSequence_picklesuite : boost::python::pickle_suite {
BOOST_STATIC_ASSERT_MSG(sizeof(cast_type) == sizeof(func_ptr_t), CANNOT_CAST_POINTER_TO_REQUESTED_TYPE);

static boost::python::list getstate(const CallSequence& cs) {
boost::python::list ret;
BOOST_FOREACH(func_ptr_t p, cs._seq)
ret.append(reinterpret_cast<cast_type>(p));
return ret;
}

static void setstate(CallSequence& cs, boost::python::list l) {
std::list<func_ptr_t> new_list;
boost::python::stl_input_iterator<cast_type> begin(l), end;
for(; begin != end; begin++)
new_list.push_back(reinterpret_cast<func_ptr_t>(*begin));
cs._seq.swap(new_list);
}
};

/*
* Run the call sequence
*/
double runner(const CallSequence& cs) {
double ret = 0;
BOOST_FOREACH(const func_ptr_t& p, cs._seq)
ret += p(2.18);
return ret;
}

BOOST_PYTHON_MODULE(my_extension) {
using namespace ::boost::python;

class_<CallSequence>("CallSequence")
.def_pickle(CallSequence_picklesuite<unsigned int>());
def("runner", runner);
}

编译:

$ g++ question1.cpp -lboost_python -I /usr/include/python2.7 -shared -o my_extension.so

跨多个进程调用它的 Python 代码:

#!/usr/bin/python

from multiprocessing import Pool

import my_extension

def runner(sequence):
return my_extension.runner(sequence)

def main():
l = [my_extension.CallSequence() for _ in range(200)]

pool = Pool(processes=4)
print pool.map(runner, l)

if __name__ == '__main__':
main()

输出符合预期。我想知道我是否只是“走运”,或者我是否可以可靠地期望函数指针在 fork() 之后保持有效。

最佳答案

当然——地址空间在您 fork 时被复制,因此指针在之后对于父进程和子进程仍然有效。

关于c++ - 函数指针是否在进程间保持有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7129342/

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