gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:08:33 25 4
gpt4 key购买 nike

我有一些与 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....
}

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

int main()
{
...
Demo objDemo;
for(...)
{
objDemo.setConstant(<somevalue>);
objDemo.submitTask();
}
...
}

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

我不想仅仅因为这个约束就强制执行同步任务。事先不知道创建的任务数量。我只需要以一种适用于异步的优雅方式传递这个简单的整数常量。显然我无法更改运行时行为(意味着此方法的签名 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]);
}

稍后当您确定一切都已完成时,再调用

delete[] values;

或者,替代地,创建一个 Demo 对象数组而不是一个整数数组。

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

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

关于c++ - 将新数据传递给可能仍在使用旧数据的异步线程函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5114778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com