将新数据传递给可能仍在使用旧数据的异步线程函数

usm*_*man 0 c c++ multithreading asynchronous class

我遇到了一些与C/C++相关的问题:假设我有一些课程

class Demo
{
   int constant;
   public:
    void setConstant(int value)
    {
        constant=value;
    }
    void submitTask()
    {
       // need to make a call to C-based runtime system to submit a 
       // task which will be   executed "asynchronously"
       submitTask((void *)&constant);
    }
};

// runtime system will call this method when task will be executed
void func(void *arg)
{
    int constant= *((int *)arg);
    // Read this constant value but don't modify here....
}
Run Code Online (Sandbox Code Playgroud)

现在在我的应用程序中,我做了这样的事情:

int main()
{
  ...
  Demo objDemo;
  for(...)
  {
     objDemo.setConstant(<somevalue>);
     objDemo.submitTask();
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

现在,希望您看到问题,因为任务应该在异步调用之前立即读取值集.由于任务调用是异步的,因此任务可以读取错误的值,有时会导致意外行为.

我不想仅仅因为这个约束而强制执行同步任务.创建的任务数量事先不知道.我只需要以优雅的方式传递这个简单的整数常量,它将与异步一起使用.显然我无法改变运行时行为(意味着此方法的签名void func(void *arg)是固定的).

提前致谢.

Kei*_*win 5

如果您不想在进行下一次调用之前等待C代码完成,那么您不能一遍又一遍地重复使用相同的内存位置.而是创建一个数组,然后传递这些位置.对于这段代码,我将假设for循环运行的次数是n.在for循环运行之前,不必知道这一点.

int* values = new int[n];
for(int i=0;i<n;i++) {
    values[i] = <somevalue>;
    submitTask((void*)&values[i]);
}
Run Code Online (Sandbox Code Playgroud)

在稍后您确定已完成所有操作时,请致电

delete[] values;
Run Code Online (Sandbox Code Playgroud)

或者,替代是一组int,而不是创建一个Demo对象数组.

Demo demo[] = new Demo[n];
for(int i=0;i<n;i++) {
    demo[i].setConstant(<somevalue>);
    demo[i].submitTask();
} 
Run Code Online (Sandbox Code Playgroud)

但是第一个对我来说更有意义,因为Demo对象似乎没有做任何有价值的事情.但是您可能遗漏了与问题无关的方法和成员,因此可以更改哪个选项最佳.无论如何,重点是如果您不知道它们何时会被使用并且不想等待,则需要单独的内存位置来获取单独的值.