cpp中将含有指针形式传递参数的函数添加到多线程中 代码示例
时间: 2024-03-10 16:44:47 浏览: 21
当函数的参数是指针类型时,我们可以直接将指针传递给 `std::thread` 类的构造函数,但需要注意的是,在多个线程中访问同一个指针时,需要进行同步,以避免出现数据竞争的问题。下面是一个示例代码,展示了如何将含有指针形式传递参数的函数添加到多线程中:
```c++
#include <iostream>
#include <thread>
void threadFunc(int* ptr) {
(*ptr)++;
}
int main() {
int val = 10;
std::thread t(threadFunc, &val);
t.join();
std::cout << "Value: " << val << std::endl;
return 0;
}
```
在上面的代码中,我们定义了一个函数 `threadFunc`,它的参数是一个 `int` 类型的指针。在 `main` 函数中,我们创建了一个 `int` 类型的变量 `val`,并将其初始化为 `10`。然后,我们使用 `std::thread` 类来创建一个新的线程,并将 `val` 的地址作为参数传递给 `threadFunc` 函数。在线程中,我们通过指针访问 `val` 的值,并将其加 1。最后,我们调用 `join()` 函数来等待线程执行完成,并输出 `val` 的值,确认其已经被修改为 `11`。
需要注意的是,在多个线程中访问同一个指针时,需要使用互斥锁等同步机制,以避免出现数据竞争的问题。
相关问题
cpp中将含有引用形式传递参数的函数添加到多线程中 代码示例
当函数的参数是引用类型时,我们需要使用 `std::ref` 函数来将其包装为一个可复制的对象,以便在多个线程中使用。下面是一个示例代码,展示了如何将含有引用形式传递参数的函数添加到多线程中:
```c++
#include <iostream>
#include <thread>
void threadFunc(int& val) {
val++;
}
int main() {
int val = 10;
std::thread t(threadFunc, std::ref(val));
t.join();
std::cout << "Value: " << val << std::endl;
return 0;
}
```
在上面的代码中,我们定义了一个函数 `threadFunc`,它的参数是一个 `int` 类型的引用。在 `main` 函数中,我们创建了一个 `int` 类型的变量 `val`,并将其初始化为 `10`。然后,我们使用 `std::thread` 类来创建一个新的线程,并将 `val` 的引用包装为一个可复制的对象,以便在线程中使用。在线程中,我们调用了 `threadFunc` 函数,将 `val` 的值加 1。最后,我们调用 `join()` 函数来等待线程执行完成,并输出 `val` 的值,确认其已经被修改为 `11`。
需要注意的是,如果我们不使用 `std::ref` 函数来包装引用类型的参数,直接将引用类型的参数传递给 `std::thread` 类的构造函数,会导致编译错误。因为 `std::thread` 类的构造函数会将传递的参数进行复制,而引用类型的参数不能被复制。
sleep函数在linux中的用法 cpp代码示例
下面是一个简单的 C++ 代码示例,展示了如何在 Linux 中使用 `sleep()` 函数:
```cpp
#include <iostream>
#include <unistd.h>
int main() {
std::cout << "Start sleeping..." << std::endl;
sleep(3); // 暂停 3 秒钟
std::cout << "Wake up!" << std::endl;
return 0;
}
```
在上面的示例中,程序会输出 "Start sleeping...",然后调用 `sleep()` 函数暂停 3 秒钟。最后,程序会输出 "Wake up!",并退出。输出结果如下:
```
Start sleeping...
Wake up!
```
需要注意的是,`sleep()` 函数的精度只能保证到秒级别,如果需要更高精度的等待,可以考虑使用 `nanosleep()` 函数。