C++多线程问题

#include<iostream>
#include<thread>
#include<Windows.h>

void do_something(unsigned) { std::cout << 1 << ' '; }
struct func {
	int& i;
	func(int& i_) :i(i_) {}
	void operator()() {
		for (unsigned j = 0; j < 10; ++j) {
			do_something(i);
		}
	}
};
class scoped_thread {
	std::thread t;
public:
	explicit scoped_thread(std::thread t_) :t(std::move(t_)) {
		if (!t.joinable())
			throw std::logic_error("NO thread");//抛异常,当这个线程不能被结合,也就是join或者death的时候就抛出异常
												//使用std::logic_error其实和普通的没啥区别,但是好管理一些,看起来标准
	}
	~scoped_thread() {
		//join 等待线程结束 如果没结束就卡在join里面直到结束,执行太快了,我误以为是要join才会打印,其实不需要,我们加一个Sleep就看出来了
		//子线程是一个循环,我们这个函数太短了,运行完的时候子线程函数还没运行完,就需要在join卡住才能执行完
		Sleep(1000);
		t.join();
	}
	//scoped_thread(std::thread const&) = delete;
	scoped_thread operator=(scoped_thread const&) = delete;
};
void f() {
	int some_local_state = 0;
	scoped_thread t{ std::thread(func(some_local_state)) };
}
int main() {
	f();
}

这边是第一个例子,我一开始以为子线程在没有状态的时候不会自己运行,因为我调试多次都只有在join的之后才会得到打印结果,以至于我认为,子线程需要和主线程结合才能打印结果,但是实际是子线程要比主线程复杂,子线程在thread对象赋值的时候就开始运行了,我加了一个Sleep(1000)就能在join之前得到结果

join 等待线程结束 如果没结束就卡在join里面直到结束,执行太快了,我误以为是要join才会打印,其实不需要,我们加一个Sleep就看出来了
        子线程是一个循环,我们这个主线程函数太短了,运行完的时候子线程函数还没运行完,就需要在join卡住才能执行完

#include<thread>
#include<iostream>
#include<vector>
void do_word(unsigned id) {
	std::cout << id << '\n';
}
void f() {
	std::vector<std::thread>threads;
	for (unsigned i = 0; i < 20; ++i) {
		threads.emplace_back(do_word, i);//生成主线程,此成员函数在C++14添加
	}
	for (auto& entry : threads)
		entry.join();
}
int main() {
	f();
}
//因为线程之间的运行速度不一样,所以结果一般都不一样,资源争夺,当thread对象创建好的时候子线程开始运行

编译器支持C++14的可以运行此段代码,每一次结果都不一样,原因是因为多个线程同时运行,无法确定到底哪个线程运行的要快一些打印出来,恰好佐证了我上面的意思。

好的,关于C++多线程问题,您有什么具体的问题需要我帮助吗?以下是一些常见的问题和解答: 1. 什么是C++多线程C++多线程是指使用C++编程语言实现的一种多线程编程方式,它可以让程序在多个线程中同时运行,从而提高程序的执行效率。 2. 如何在C++中创建和启动一个线程? 在C++11及以上的标准中,可以使用std::thread类来创建和启动一个线程。例如,以下代码创建一个新的线程并启动它: ``` #include <iostream> #include <thread> void thread_func() { std::cout << "Hello from thread!\n"; } int main() { std::thread t(thread_func); t.join(); return 0; } ``` 在上面的代码中,std::thread类的构造函数接受一个函数指针作为参数,该函数指针指向线程要执行的函数。在main函数中,我们创建了一个新的线程t,该线程会执行thread_func函数。最后,我们调用t.join()函数来等待线程执行完毕。 3. 如何在C++中使用互斥锁? 在C++中,可以使用std::mutex类来实现互斥锁。例如,以下代码演示了如何在多个线程中访问共享变量时使用互斥锁: ``` #include <iostream> #include <thread> #include <mutex> std::mutex mtx; int shared_var = 0; void thread_func() { for (int i = 0; i < 100000; i++) { mtx.lock(); shared_var++; mtx.unlock(); } } int main() { std::thread t1(thread_func); std::thread t2(thread_func); t1.join(); t2.join(); std::cout << "shared_var = " << shared_var << std::endl; return 0; } ``` 在上面的代码中,我们使用std::mutex类来保护共享变量shared_var的访问。在thread_func函数中,每个线程会对shared_var进行100000次加1运算,由于shared_var是一个共享变量,因此必须使用互斥锁来保护它的访问。通过调用std::mutex类的lock和unlock函数,我们可以确保每个线程在访问shared_var时都会先获得互斥锁,从而避免了竞态条件的发生。 希望这些信息能对您有所帮助。如果您有其他问题,请随时告诉我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值