如何在不同的线程中对同一类的多个对象进行方法调用?

时间:2014-12-06 03:21:08

标签: c++ multithreading

我是c ++中的noob并且有一个类(mystack),其中有一个方法(推送),可以使用

调用
mystack a;
a.push();

现在我已经创建了多个A类实例,并且对于每个实例我想调用push方法,我想知道如何在不同的线程中调用它们,谢谢。


修改

完整的代码如下(它很长但很简单直接),有两个类mystack实例,每个实例都进行一系列方法调用,我想在不同的实例中进行方法调用不同的线程,所以我想在一个线程中进行实例stc的push和pop操作,并在另一个线程中的stc2中进行相同的操作,我将如何实现呢?

#include "stdafx.h"
#include <string>
#include <iostream>
#include <thread>
#include <vector>
#include <mutex>

using namespace std;

//static recursive_mutex mtx;

struct mystack
{
    int *p;
    unsigned int limit, counter;

public:
    unsigned int max()
    {
        return limit;
    }

    ~mystack()
    {
        delete p;
    }

    mystack(int k) : limit(k), p(0), counter(0)
    {
        if (limit > 0)
        {
            p = new int[limit];
        }
    }

    void push(unsigned int k)
    {
        if (counter >= limit)
        {
            throw 1;
        }

        p[counter] = k;
        counter++;
    }

    int pop()
    {
        if (counter <= 0)
        {
            throw 1;
        }

        counter--;

        return p[counter];
    }
};

int main(int, char*[])
{
    mystack stc(5);
    try
    {
        stc.push(1);
        stc.push(2);
        stc.push(3);
        stc.push(4);
        stc.push(5);
        stc.push(6);
    }
    catch (int i)
    {
        try
        {
            cout << "pop out the values" << endl;
            while (true)
            {
                cout << stc.pop() << " ";
            }
        }
        catch (int j)
        {
            cout << endl;
            cout << "stack is now empty" << endl;
            cout << endl;
        }
    }


    mystack stc2(3);
    try
    {
        stc2.push(1);
        stc2.push(2);
        stc2.push(3);
        stc2.push(4);
        stc2.push(5);
        stc2.push(6);
    }
    catch (int i)
    {
        try
        {
            cout << "pop out the values" << endl;
            while (true)
            {
                cout << stc2.pop() << " ";
            }
        }
        catch (int j)
        {
            cout << endl;
            cout << "stack is now empty" << endl;
            cout << endl;
        }
    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

您已经提出了一个相当普遍的问题,但假设您还没有创建任何线程,那么使用C ++ 11和std :: thread将是您最好的选择:

#include <iostream>
#include <thread>

struct A
{
    int id;
    A(int i) : id(i) {}

    void push() {
        std::cout << id << " pushin." << std::endl;
    }
};

A obj_a(0);
void push_global() {obj_a.push();}

void push_an_A(A& obj) {obj.push();}

int main()
{
    A obj_b(1),
      obj_c(2);

    // globals (not recommended)
    std::thread thread_a(push_global);

    // using lambdas
    auto push_b = [&obj_b](){
        obj_b.push();
    };

    std::thread thread_b(push_b);

    // binding
    std::thread thread_c(std::bind(push_an_A, obj_c));

    thread_a.join();
    thread_b.join();
    thread_c.join();
}

请务必使用您的编译器等同于-std=c++11-pthread选项。

编辑:对于您的更新代码,(尽管流量控制正在进行中,但奇怪的是使用异常),它就像执行您正在执行的操作序列一样简单并将它们粘贴在一个函数中:

void do_sequence(mystack &stack)
{
    try
    {
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);
        stack.push(6);
    }
    catch (int i)
    {
        try
        {
            cout << "pop out the values" << endl;
            while (true)
            {
                cout << stack.pop() << " ";
            }
        }
        catch (int j)
        {
            cout << endl;
            cout << "stack is now empty" << endl;
            cout << endl;
        }
    }
}

int main(int, char*[])
{
    mystack stc(5),
        stc2(3);

    // note that we need to use std::ref() so that the arguments are correctly
    // passed by reference, otherwise we get memory corruption
    std::thread thread_stc(std::bind(do_sequence, std::ref(stc))),
        thread_stc2(std::bind(do_sequence, std::ref(stc2)));

    thread_stc.join();
    thread_stc2.join();

    return 0;
}