在运行时擦除持有pthread的变量

erasing the variable holding a pthread while running

本文关键字:pthread 变量 运行时 擦除      更新时间:2023-10-16

我的程序中有一个映射,用于保存由pthread_create方法创建的pthread(该方法需要一个放置该pthread的位置),并与相关的线程ID相关联。
在pthread函数的最后一个命令中是否存在从映射中擦除pthread的问题?

正如您所说,您正在持有线程ID。它只是一个数字。仅此而已。

删除元素(number)不会对程序造成任何损害。

编辑:但是你应该检查一下,std::map中的擦除元素是同步的。别忘了STL容器可能不是线程安全的。

Edit2:要确保同步没有问题,请执行以下操作:

pthread_mutex_t mut;         //global variable
pthread_mutex_init(&mut,0);  //initialize mutex before calling pthread_create()

//and use mutex to prevent synchronization problems in the end of .
pthread_mutex_lock(&mut);
my_map.erase(key);
pthread_mutex_unlock(&mut);

我同意Ashot Martirosyan提供的答案。我只是想再补充一点。

如果线程被创建为可连接的,那么应用程序将需要调用pthread_join();否则会泄漏内存。如果map是唯一记录线程ID的地方,那么如果每个线程在死亡之前从map中删除了它的线程ID,那么您将无法与线程连接。

您可以随时删除数据。但是,如果线程访问这个映射,程序中可能会出现竞争条件。如果线程A正在退出,但在擦除数据之前被交换出去,线程B可能会看到线程A的数据,并认为线程A仍然是一个可行的线程。

您应该pthread_joinpthread_detach或创建一个分离的线程,否则您将从pthread_create获得错误。对于所有可接合的线程,操作系统保留一定数量的内存来存储线程返回值。为此目的保留的总内存量是有限的,并且可能比您期望的要少,因此分离您不打算加入的所有线程。