连续启动线程可能导致内存泄漏?

时间:2018-04-17 16:07:25

标签: c++ multithreading visual-studio c++11 visual-c++

(首先,抱歉我的英语不好。) 我为我当前的项目编写了一些测试代码,我相信,我编写了低效的代码:我想开始一个新的线程(它应该与主线程异步运行 - >我使用detach()),用户在键盘上输入三个键后。例如。这个线程应该工作五秒钟,当线程工作时,用户可以输入越来越多的键,并且总是在三个输入后开始一个线程:

#include <iostream>
#include <cstdlib>
#include <thread>
#include <mutex>

using namespace std;

mutex m;
const int MAX_letters = 3;
int letters = MAX_letters;
thread st;

void send() {
    cout << "\nsending ... [START] ... " << this_thread::get_id() << "\n";
    this_thread::sleep_for(chrono::seconds(5));
    cout << "\nsending ... [END] ...   " << this_thread::get_id() << "\n";
}

int main() {

    while (true) {

        if (letters > 0) {
            system("PAUSE");
            --letters;
        } else {
            st = thread(send);
            st.detach();
            letters = MAX_letters;
        }

    }

    return 0;

}

系统(“暂停”)应模拟按键......

现在我的问题:即使另一个正在运行,是否可以为st分配一个新线程?

3 个答案:

答案 0 :(得分:2)

是的,你正在做什么是允许的。由于线程是分离的(使用分离线程是有问题的,但我不讨论这个,因为它不是问题),可以重新分配线程对象。之后,该对象将引用新线程(直到再次重新分配)。您可以查看参考资料以获取更多信息: http://en.cppreference.com/w/cpp/thread/thread/operator%3D

修改

实际上你甚至不需要这个变量。 std::thread(send).detach()会这样做。

答案 1 :(得分:0)

启动这样的线程没有问题,但是,您可能希望添加退出$SourceDir = "D:\SQLServer2016\BackupOne,D:\SQLServer2016\BackupTwo" $SplitDir = $SourceDir -split ',' $index = 0 $Backups = @() foreach($dir in $SplitDir) { $index ++ $Object = New-Object PSObject -Property @{ Directory = $dir BackupNumber = $index } $Backups += $Object } $Backups 循环的条件。 while(true)允许线程资源被回收,因此这里没有内存泄漏。

答案 2 :(得分:0)

docs没有明确说明在detach()之后线程对象被重置为未初始化状态。

然而,文档确实说,在detach()之后可以安全地销毁线程对象,并且你正在使用operator= (thread&& rhs)来分配它,如果你没有分离(),那么再次记录它以销毁旧线程编辑它,所以一切都应该是好的。

但使用本地临时工具会不会更简单明了?

   } else {
        thread st(send);
        st.detach();
        letters = MAX_letters;
   }