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)是固定的).
提前致谢.
如果您不想在进行下一次调用之前等待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对象似乎没有做任何有价值的事情.但是您可能遗漏了与问题无关的方法和成员,因此可以更改哪个选项最佳.无论如何,重点是如果您不知道它们何时会被使用并且不想等待,则需要单独的内存位置来获取单独的值.