(首先,抱歉我的英语不好。) 我为我当前的项目编写了一些测试代码,我相信,我编写了低效的代码:我想开始一个新的线程(它应该与主线程异步运行 - >我使用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分配一个新线程?
答案 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;
}