在类DiskScheduler中,函数StartWorkerThread想要创建线程调用processthread函数,同时线程传入的参数为引用传参;
void DiskScheduler::StartWorkerThread() {
while (true) {
auto tmp = request_queue_.Get();
if (tmp == std::nullopt) {
break;
}
std::thread now(&DiskScheduler::processthread,tmp.value());
now.join();
}
}
上面创建线程的方式编译不通过;因为类里面的函数,没有对象,怎么能够调用呢? 所以编译错误。。。
改成下面这种写法
void DiskScheduler::StartWorkerThread() {
while (true) {
auto tmp = request_queue_.Get();
if (tmp == std::nullopt) {
break;
}
std::thread now(&DiskScheduler::processthread,this,tmp.value());
now.join();
}
}
然后考虑引用传参的问题;
在 C++ 中,std::thread
构造函数中的参数是以值传递的。当你创建一个新的线程时,std::thread
构造函数会复制传递给它的参数。
这意味着,如果你向 std::thread
构造函数传递一个对象或者变量,它们会被复制到新线程的内部存储空间中。这可能会导致一些意想不到的行为,尤其是当涉及到资源所有权和对象生命周期管理时。
如果你需要在线程之间共享数据,你可能需要使用引用传递或者指针传递,以便多个线程可以访问相同的数据。你可以使用 std::ref
来传递引用,或者使用指针来传递数据。
指针传递:
void DiskScheduler::processthread(DiskRequest* r){
auto& t=*r;
if(t.is_write_){
disk_manager_->WritePage(t.page_id_,t.data_);
t.callback_.set_value(true);
}else{
disk_manager_->ReadPage(t.page_id_,t.data_);
t.callback_.set_value(true);
}
}
void DiskScheduler::StartWorkerThread() {
while (true) {
auto tmp = request_queue_.Get();
if (tmp == std::nullopt) {
break;
}
auto tt=&tmp.value();
std::thread now(&DiskScheduler::processthread,this,tt);
now.join();
}
}