线程同步c++

发布时间:2023年12月22日

C++线程的使用 | 爱编程的大丙

线程分离函数detach()不会阻塞线程,子线程和主线程分离之后,在主线程中就不能再对这个子线程做任何控制了,比如:通过join()阻塞主线程等待子线程中的任务执行完毕,或者调用get_id()获取子线程的线程ID。?

void func(int num, string str)
{
	for (int i = 0; i < 10; ++i)
	{
		cout << "子线程: i = " << i << "num: "
			<< num << ", str: " << str << endl;
	}
}
void func1()
{
	for (int i = 0; i < 10; ++i)
	{
		cout << "子--: i = " << i << endl;
	}
}

int main() {
	cout << "主线程的线程ID: " << this_thread::get_id() << endl;
	thread t(func,520,"iloveyou");
	thread t1(func1);
	cout << "线程t 的线程ID: " << t.get_id() << endl;
	cout << "线程t1的线程ID: " << t1.get_id() << endl;
	t.join();
	t1.detach();
	cout << t.joinable();
	cout << t1.joinable();
	system("pause");
	return 0;
}

线程同步?

假设有4个线程A、B、C、D,当前一个线程A对内存中的共享资源进行访问的时候,其他线程B, C, D都不可以对这块内存进行操作,直到线程A对这块内存访问完毕为止,B,C,D中的一个才能访问这块内存,剩余的两个需要继续阻塞等待,以此类推,直至所有的线程都对这块内存操作完毕。 线程对内存的这种访问方式就称之为线程同步,通过对概念的介绍,我们可以了解到所谓的同步并不是多个线程同时对内存进行访问,而是按照先后顺序依次进行的

常用的线程同步方式有四种:互斥锁、读写锁、条件变量、信号量。所谓的共享资源就是多个线程共同访问的变量,这些变量通常为全局数据区变量或者堆区变量,这些变量对应的共享资源也被称之为临界资源。

线程同步 | 爱编程的大丙 (subingwen.cn)

互斥锁

互斥锁是线程同步最常用的一种方式,通过互斥锁可以锁定一个代码块, 被锁定的这个代码块, 所有的线程只能顺序执行(不能并行处理),这样多线程访问共享资源数据混乱的问题就可以被解决了,需要付出的代价就是执行效率的降低,因为默认临界区多个线程是可以并行处理的,现在只能串行处理。

所有线程的任务函数执行完毕之前,互斥锁对象是不能被析构的,一定要在程序中保证这个对象的可用性。
互斥锁的个数和共享资源的个数相等,也就是说每一个共享资源都应该对应一个互斥锁对象。互斥锁对象的个数和线程的个数没有关系。

int g_num = 0;
mutex g_num_mutex;

void slow_increment(int id) {
	for (int i = 0; i < 3; ++i) {
		g_num_mutex.lock();
		++g_num;
		cout << id << "=>" << g_num << endl;
		g_num_mutex.unlock();
		//this_thread::sleep_for(chrono::seconds(1));
	}
}
int main() {
	thread t(slow_increment,0);
	thread t1(slow_increment,1);
	t.join();
	t1.join();
	return 0;
}
条件变量

条件变量是C++11提供的另外一种用于等待的同步机制,它能阻塞一个或多个线程,直到收到另外一个线程发出的通知或者超时时,才会唤醒当前阻塞的线程。条件变量需要和互斥量配合起来使用,

文章来源:https://blog.csdn.net/weixin_46430763/article/details/135133275
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。