线程可以调用类函数并访问类数据吗?

ShaZeOfShiNy-Matteo Galletta

对于我必须上学的项目,有人要求我使用线程编写程序。我正在使用的图书馆是<thread.h>为了了解线程的工作原理,我尝试通过在空白文件中编写一些代码来查看线程的行为。实际上,我感谢另一个stackoverflow问题,即如何传递给pthread_create()类函数,这确实有效,但是现在又有另一个问题,我在任何地方都找不到答案。该程序编译并打印与我在类中放入的整数不对应的随机整数。也许线程调用的方法无法访问类内部的数据?那是代码:

class myClass {

    public:
        myClass() {
            for(int i = 0; i < 5; i++)
                values[i] = i*3;
        }
        void myFunction() {
            
            pthread_t processIDs[5];
            int count[5];
            
            for(int i = 0; i < 5; i++) {
                count[i] = i;
                pthread_create(&processIDs[i], NULL, &printIntegerHelper, &count[i]);
            }
            for(int i = 0; i < 5; i++) {
                pthread_join(processIDs[i], NULL);
            }
        }
    private:
        void* printInteger(int index) {
            printf("%d", values[index]);
        }
        static void* printIntegerHelper(void* arg) {
            Sleep(20);
            return ((myClass *) arg)->printInteger(*((int*)arg));
        }
    protected:
        int values[5];
};
int main(void){
    
    myClass myObject;
    
    myObject.myFunction();
    
    return 0;
}
v

这里的主要问题是您试图将单个指针转换arg为指向不同无关事物的两个指针,然后取消对结果的引用。如果没有不确定的行为,您将无法做到。您只能将一个指针传递给pthread_create(),并且如果您需要传递更多的指针(例如,指针+索引),则需要一个附加的间接方式:将您的信息包装到struct(或std::pair/ std::tuple)中,然后将一个指针传递给它。这就是std::thread内部的事情

简单的例子:

using Data = std::pair<myClass*, int>;

void myFunction() {            
    // ...

    Data data[5];            
    for (int i = 0; i < 5; ++i) {
        data[i] = {this, i};
        pthread_create(&processIDs[i], NULL, &printIntegerHelper, &data[i]);
    }

    // ... (all created threads are joined here, so
    //      accessing data inside a thread is safe)
}

static void* printIntegerHelper(void* arg) {
    const auto data = *reinterpret_cast<Data*>(arg);
    data.first->printInteger(data.second);
    return nullptr;
}

还要注意,即使以后不使用该值,非void函数也应该起作用return唯一的例外是int main(...)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

可以访问类数据成员并在析构函数中对它们执行操作吗?

来自分类Dev

虚函数可以访问基类的朋友吗?

来自分类Dev

继承的类可以访问基类吗

来自分类Dev

从Aspect函数访问被调用者类的数据成员

来自分类Dev

从Aspect函数访问被调用者类的数据成员

来自分类Dev

派生类可以访问基类的构造函数和析构函数吗?

来自分类Dev

在Kotlin数据类中调用超类构造函数之前的访问函数

来自分类Dev

函数可以成为Python数据类成员吗?

来自分类Dev

我们可以快速从基类访问重写的类函数吗?

来自分类Dev

我们可以快速从基类访问重写的类函数吗?

来自分类Dev

替代在类构造函数中调用线程

来自分类Dev

当线程都属于同一类时,线程可以共享公用数据元素吗?

来自分类Dev

可以在不同线程上调用的类的实例方法使用该类的属性吗?

来自分类Dev

为什么要将一个类的线程函数设为静态以便在同一类中可以访问?

来自分类Dev

从基础调用访问派生的crtp类的函数

来自分类Dev

如何从python类函数访问对self的调用

来自分类Dev

父类的成员函数可以访问子类的成员函数吗?如何?

来自分类Dev

可以在类构造函数中初始化线程导致崩溃吗?

来自分类Dev

元类可以是可调用的吗?

来自分类Dev

我可以显式地调用类的构造函数和析构函数吗?

来自分类Dev

Android:从类访问线程

来自分类Dev

Android:从类访问线程

来自分类Dev

在JavaScript类中调用父方法,但stll可以访问对象实例内部的原型方法吗?

来自分类Dev

类内部的类可以从外部类调用 getter 方法吗?

来自分类Dev

类模板可以作为函数吗

来自分类Dev

类可以继承__init __()函数吗?(蟒蛇)

来自分类Dev

如何确保某些类和函数调用可以访问所有 GUI 输入变量?

来自分类Dev

函数可以在不使用python中的global的情况下访问类的实例吗?

来自分类Dev

我可以在没有任何前向声明的类/结构上访问静态成员函数吗?

Related 相关文章

  1. 1

    可以访问类数据成员并在析构函数中对它们执行操作吗?

  2. 2

    虚函数可以访问基类的朋友吗?

  3. 3

    继承的类可以访问基类吗

  4. 4

    从Aspect函数访问被调用者类的数据成员

  5. 5

    从Aspect函数访问被调用者类的数据成员

  6. 6

    派生类可以访问基类的构造函数和析构函数吗?

  7. 7

    在Kotlin数据类中调用超类构造函数之前的访问函数

  8. 8

    函数可以成为Python数据类成员吗?

  9. 9

    我们可以快速从基类访问重写的类函数吗?

  10. 10

    我们可以快速从基类访问重写的类函数吗?

  11. 11

    替代在类构造函数中调用线程

  12. 12

    当线程都属于同一类时,线程可以共享公用数据元素吗?

  13. 13

    可以在不同线程上调用的类的实例方法使用该类的属性吗?

  14. 14

    为什么要将一个类的线程函数设为静态以便在同一类中可以访问?

  15. 15

    从基础调用访问派生的crtp类的函数

  16. 16

    如何从python类函数访问对self的调用

  17. 17

    父类的成员函数可以访问子类的成员函数吗?如何?

  18. 18

    可以在类构造函数中初始化线程导致崩溃吗?

  19. 19

    元类可以是可调用的吗?

  20. 20

    我可以显式地调用类的构造函数和析构函数吗?

  21. 21

    Android:从类访问线程

  22. 22

    Android:从类访问线程

  23. 23

    在JavaScript类中调用父方法,但stll可以访问对象实例内部的原型方法吗?

  24. 24

    类内部的类可以从外部类调用 getter 方法吗?

  25. 25

    类模板可以作为函数吗

  26. 26

    类可以继承__init __()函数吗?(蟒蛇)

  27. 27

    如何确保某些类和函数调用可以访问所有 GUI 输入变量?

  28. 28

    函数可以在不使用python中的global的情况下访问类的实例吗?

  29. 29

    我可以在没有任何前向声明的类/结构上访问静态成员函数吗?

热门标签

归档