2010-03-03 81 views
1

我想多线程的东西,我有我的程序设置,使我有一个结构/类的变量,将传递到每个线程进行处理。要删除哪个指针?

在这个类中,有一些变量持有指向数组的数据,一些线程拥有从中读取数据的公用数组,而不是重复这些数组,指针指向每个将它们指向一个数组的函数。这些常用数组在主程序中初始化,然后将类数组中的变量指向该数组,然后将该数组传递给线程。

我的问题是在哪个级别(主程序或线程)我应该使用delete命令来终止该阵列?另外,当我这样做时,其他指针会发生什么?他们是否自动删除,或者我是否必须手动跟踪这些。最后,如果我不小心删除了一个数组而另一个线程仍在使用它,会发生什么?

感谢,

-Faken

回答

1

如果删除其他线程仍在使用数组,你得到了一个未定义的行为,雾可能崩溃。

对于你的情况,我建议清理在主线程,所有的工作线程完成之后。

另一种可能性是使用共享指针,一旦没有线程使用它们,它就会自动释放资源(尽管要注意您需要保护您对共享指针的访问 - 对于MSVC标准库中的shared_ptr它受到保护automatically)。

1

删除不修改指针,反而使得被指向unuseable内存。

所以一旦一些内存被删除,你不能引用它。这仅仅是一个指针作为多个指针是真的:

您可以使用,将使用引用计数,这样,当所有的指针被释放底层的内存只会被删除共享指针。对于你的例子,你需要确保共享指针是线程安全的。

0

的处理(应用程序)内的所有变量都跨线程共享,任何修改的变量或存储器将必须能够访问它,除非使用的是线程本地存储(TLS)的所有线程的效果。

如果您删除阵列,然后使用它的另一个线程,结果将是,当你删除阵列一样,那么你重新访问(访问冲突主要是由于崩溃),它的地方在你的代码。

至于“哪个级别”的问题,我认为最好是通过创建对象的线程释放对象以避免混淆,并确保这些对象不再需要被另一个线程使用。