亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

std::thread arguments must be invocable after conversion to rvalues

標簽:
雜七雜八
C++11 标准库中的 std::thread 类

C++11 标准库中的 std::thread 类提供了一个用于创建和管理线程的封装。线程是多任务并行执行的一个实体,它可以使程序同时执行多个任务,从而提高程序的运行效率。

使用 std::thread 时需要注意的问题

在使用 std::thread 时,我们需要注意传递给它的参数必须能够被调用。这是因为在 C++11 之后,rvalue 可以被直接作为函数参数和返回值。

以一个简单的例子来说明:

#include <iostream>
#include <thread>

void print_hello() {
    std::cout << "Hello from thread!" << std::endl;
}

int main() {
    auto&& arg = print_hello;  // 将函数及其参数移动到左端
    std::thread t(arg);       // 创建线程并执行函数

    return 0;
}

在这个例子中,我们定义了一个名为 print_hello 的函数,它接受一个 void 类型的参数。在 main 函数中,我们将 print_hello 函数及其参数传递给 std::thread 构造函数。这里需要注意的是,arg 是一个 std::add_const_t<decltype(arg)> 类型的变量,表示将参数类型转换为常量类型,以确保在创建线程时不会丢失类型信息。

现在让我们来看一下这个代码在编译时会检查什么。在编译时,会检查 arg 是否可以被转换为 void* 类型,因为 std::thread 构造函数需要一个 void* 类型的参数来保存线程 ID。如果 arg 不能被转换为 void* 类型,那么编译器会报错。

为了满足这种需求,我们可以将 arg 包装在一个 std::function 对象中。这样,我们就可以将 arg 作为参数传递给 std::thread 构造函数了。

#include <functional>

void print_hello() {
    std::cout << "Hello from thread!" << std::endl;
}

int main() {
    auto&& arg = std::bind(print_hello, nullptr);  // 将函数及其参数绑定到左端
    std::thread t(arg);       // 创建线程并执行函数

    return 0;
}

在这个例子中,我们使用了 std::bind 函数将 print_hello 函数和它的参数绑定在一起,并将结果赋值给 arg。这样,我们就可以将 arg 作为 std::thread 构造函数的一个重要参数了。

使用 std::thread 时需要注意的问题

在使用 std::thread 时,我们需要注意传递给它的参数必须能够被调用。这是因为在 C++11 之后,rvalue 可以被直接作为函数参数和返回值。

以一个简单的例子来说明:

#include <iostream>
#include <thread>

void print_hello() {
    std::cout << "Hello from thread!" << std::endl;
}

int main() {
    auto&& arg = print_hello;  // 将函数及其参数移动到左端
    std::thread t(arg);       // 创建线程并执行函数

    return 0;
}

在这个例子中,我们定义了一个名为 print_hello 的函数,它接受一个 void 类型的参数。在 main 函数中,我们将 print_hello 函数及其参数传递给 std::thread 构造函数。这里需要注意的是,arg 是一个 std::add_const_t<decltype(arg)> 类型的变量,表示将参数类型转换为常量类型,以确保在创建线程时不会丢失类型信息。

现在让我们来看一下这个代码在编译时会检查什么。在编译时,会检查 arg 是否可以被转换为 void* 类型,因为 std::thread 构造函数需要一个 void* 类型的参数来保存线程 ID。如果 arg 不能

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消