pthread并行运行类实例的方法

时间:2014-10-26 05:09:05

标签: c++ multithreading pthreads

我有一个Drone类,它基本上是一对整数(x, y),用于它在2D笛卡尔平面中的位置,并在同时向目标{{1}移动一步时打印其位置}}

我在

中这样做
(dest_x, dest_y)

方法,负责启动,移动,避免与其他void * run(void); 的碰撞。

Drone的实例存储在Drone中,这是一个全局变量。

当我初始化vector<Drone*> drones并按顺序运行Drone时,它会正确打印出结果。

例如,

run()

使用

location: (0, 0)
.
.
location: (5, 5)
Warning: drone 1 and 0may collide. Running collision avoidance.
.
.
location: (15, 22)
location: (15, 23)
drone 0 successfully served its delivery request.
returning to the control center...
location: (14, 22)
location: (13, 21)
.
.
location: (0, 0)

但是,我想并行运行,即Drone* d = new Drone(0); d->set_loc(0, 0); d->set_dest(15, 23); drones.push_back(d); . . drones[0]->run(); drones[1]->run(); 同时移动,而不是一个移动后移动。

为此,我定义了一个辅助类(pthread function from a class),

Drone

并尝试将其传递给static void* run_helper(void * context) { return ((Drone *)context)->run(); }

pthread_create()

它运行时没有错误,但它不会打印任何内容。

有人看到我的代码出了什么问题吗?

谢谢。


更新:

我添加了

pthread_t t[2];
for (int i = 0; i < 2; ++i) {
    pthread_create(&t[i], NULL, &Drone::run_helper, &drones[i]);
}

到主函数的结尾,现在它打印了一些东西,但是很奇怪的一个

for (int i = 0; i < 2; ++i) {
    pthread_join(t[i], NULL);
}

(我不知道为什么无人机id太大了。我用0和1初始化它们)

我应该加入帖子吗?

如果是这样,我做错了吗?(例如,Warning: drone drone_id: 82002080 location: ( and 08200272, may collide. Running collision avoidance.8200271) drone_id: 8200208 location: (0, 8200270) Warning: drone 0 and 8200270may collide. Running collision avoidance. Segmentation fault (core dumped) 应该是互斥的资源吗?)

1 个答案:

答案 0 :(得分:1)

此行中有错误

pthread_create(&t[i], NULL, &Drone::run_helper, &drones[i]);

您传递指针的地址(Drone**)并转换为指针(Drone*)。所以把它改成

pthread_create(&t[i], NULL, &Drone::run_helper, (void*)(drones[i]));