微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从c中的pthread返回double值?

在阅读完这个帖子之后: How to return a value from thread in C关于如何从pthread返回一个整数值,我测试了它是否可以用于double,但它没有.有没有办法从pthread进程返回double,long或字符串,如原始线程中所述,而不是返回整数42?

如果有,怎么样?

如果我有一个10个位置的静态数组和10个pthreads每次修改不同的位置,我会遇到麻烦吗?
例如,“线程0仅修改数组[0],线程1仅修改数组[1],依此类推”.

解决方法

这些只是将 Steve Jessop’s C solution改为C.这些玩具示例(注意缺少错误检查)使用模板来明确如何更改代码以使用除double之外的某些类型.例如,如果在完成工作后需要返回多个值,则可以用类类型替换double.在实践中,可能会删除基类和模板,并且调用者将直接调用MyWorker的work()方法,而不是通过虚方法调用.

首先,使用pthread:

#include <iostream>
#include <pthread.h>

class WorkerBase {
protected: virtual ~WorkerBase () {}
public:    virtual void * work () = 0;
};

template <typename T>
struct Worker : public WorkerBase { T result; };

extern "C" void *invoke_worker (void *arg) {
    return static_cast<WorkerBase *>(arg)->work();
}

struct MyWorker : public Worker<double> {
    void * work () {
        result = 4.2;
        return 0;
    }
};

int main () {
    pthread_t t;
    MyWorker w;
    pthread_create(&t,invoke_worker,&w);
    pthread_join(t,0);
    std::cout << "result: " << w.result << std::endl;
    return 0;
}

二,使用C 11 std :: thread:

#include <iostream>
#include <thread>

class WorkerBase {
protected: virtual ~WorkerBase () {}
public:    virtual void work () = 0;
           static void invoke (WorkerBase *w) { w->work(); }
};

template <typename T>
struct Worker : public WorkerBase { T result; };

class MyWorker : public Worker<double> {
    void work () { result = 4.2; }
};

int main () {
    MyWorker w;
    std::thread t(MyWorker::invoke,&w);
    t.join();
    std::cout << "result: " << w.result << std::endl;
    return 0;
}

您在帖子中有另一个我错过的问题:

And if I have a static array of 10 positions and 10 pthreads modifiying different positions each time,will I have trouble?

这是否会给您带来麻烦可能取决于数组元素类型和您的硬件架构.在实践中,我没有观察到x86体系结构上存在的问题,因为在机器字边界上对齐的数组元素.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐