如何在常规内部调用多个线程的函数?

时间:2016-11-25 07:12:26

标签: c++ multithreading pthreads boost-asio

我使用set HEAP=-Xms512m -Xmx1024m 定期调用函数。 我需要deadline_timer and pthread_t的返回值。 该功能需要大约60毫秒才能处理。

我喜欢每隔10毫秒用六个线程调用该函数,因此每10毫秒处理一次该函数。即使我在这里测试了两个线程,它应该以每10毫秒的间隔运行六个线程。

我使函数成为线程安全的。

MAIN.C

pthread so I use thread joinable

W_control类

int main()
{
     io_service io;
     deadline_timer t(io);
     Wheelchaircontrol w(t);
     io.run();        
     std::cout << "Exit" << endl;
}

Tracking_helper是每10毫秒执行一次的功能。

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <iostream>

using namespace std;
using namespace boost::asio;

static const int NUM_THREADS = 6;
struct Detectdirection {
    static void* Tracking_helper(void*) {
        return nullptr; // take 60ms in threadsafe manner
    }
};

class Wheelchaircontrol {
  public:
    Wheelchaircontrol(deadline_timer &t_) : t(t_) {
        d = new Detectdirection();
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
        wait();
    }
    ~Wheelchaircontrol() { delete d; }

    void timeout(const boost::system::error_code &e) {
        for (int t = 0; t < NUM_THREADS; t++) {
            usleep(10000); // 10 msec
            switch (t) {
            case 0:
                rc = pthread_create(&thread[t], &attr, d->Tracking_helper, d);
                if (rc) {
                    printf("ERROR; return code from pthread_create() is %d\n", rc);
                    exit(-1);
                }

                break;
            case 1:
                rc = pthread_create(&thread[t], &attr, d->Tracking_helper, d);
                if (rc) {
                    printf("ERROR; return code from pthread_create() is %d\n", rc);
                    exit(-1);
                }
                break;
            } // switch (t)
        } // for
        for (int t = 0; t < NUM_THREADS; t++) {
            switch (t) {
            case 0:
                rc = pthread_join(thread[t], &ret_status);
                if (!rc) {

                    free(ret_status);
                    gettimeofday(&tp, NULL);
                    long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;
                    cout << " time instance from1 " << ms << endl;
                }
                break;
            case 1:
                rc = pthread_join(thread[t], &ret_status);
                if (!rc) {

                    free(ret_status);
                    gettimeofday(&tp, NULL);
                    long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;
                    cout << " time instance from2 " << ms << endl;
                }
                break;
            } // switch (t)
        } // for
        wait();
    }

    void cancel() { t.cancel(); }

    void wait() {
        t.expires_from_now(boost::posix_time::milliseconds(1)); // 100msec
        t.async_wait(boost::bind(&Wheelchaircontrol::timeout, this, boost::asio::placeholders::error));
    }

  private:
    int rc;
    deadline_timer &t;
    struct timeval tp;
    Detectdirection *d; // for direction
    // InterfaceUSB *usb;
    pthread_t thread[NUM_THREADS];
    pthread_attr_t attr;
    void *ret_status;
    int distance;
    bool imturn;
    // myMosq *mq;
    // int cnt_mqt;
    // ofstream out;
};

但是时间实例不是等间隔的。 有时它们会在同一时间完成。 我喜欢以10毫秒的间隔拍摄全部内容。

0 个答案:

没有答案