线程冲突与解决

C++中解决线程冲突的二种方式:

一:互斥锁 mutex  要引用 mutex 头文件

二:元子变量 atomic 在头文件 atomic 

代码如下:

/*
全局:变量,冲突,结果不正确,速度快。
mutex:结果正确,速度慢。
atomic:结果正确,速度比mutex快。
*/
#include<iostream>
#include<thread>
#include<mutex>	//线程互斥量,解决线程安全
#include<atomic>	//原子变量,解决线程安全
#include<Windows.h>
using namespace std;

//测试线程安全,多线程访问就会发生线程冲突。
//int num = 0;
//
//void run()
//{
//	for (int i = 0; i < 100000; i++)
//	{
//		num++;
//	}
//}

//:二互斥锁解决线程安全
//int num = 0;
//mutex m;  //加锁、解锁花费时间。
//void run1()
//{
//	m.lock();
//	for (int i = 0; i < 100000; i++)
//	{
//		//互斥锁放在循环里,效率底。
//		//m.lock();
//		num++;
//		//m.unlock();
//	}
//	m.unlock();
//}

//三:元子量解决线程安全
//注意这儿初始化用的是大括号
atomic_int num{ 0 };	//创建一个元子变量
void run2()
{
	for (int i = 0; i < 100000; i++)
	{
		num++;
	}
}


void main()
{
	clock_t start = clock();
	thread t1(run2);
	thread t2(run2);
	t1.join();
	t2.join(); //等待t1,t2线程运行完成。
	//发现结果不对,这就是多线程冲突。
	cout << num << endl;

	clock_t end = clock();
	cout << end - start << endl;
	cin.get();
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当多个线程同时对同一个ArrayList进行读写操作时,可能会出现线程冲突的情况。下面是一个简单的案例来演示ArrayList线程冲突的问题: ```java import java.util.ArrayList; public class ArrayListThreadConflictExample { private static ArrayList<String> list = new ArrayList<>(); public static void main(String[] args) { Thread thread1 = new Thread(() -> { for (int i = 0; i < 1000; i++) { list.add("Thread 1"); } }); Thread thread2 = new Thread(() -> { for (int i = 0; i < 1000; i++) { list.add("Thread 2"); } }); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Size of ArrayList: " + list.size()); } } ``` 在上述代码中,有两个线程SQL权威指南是一本著名的数据库技术书籍,由Joe Celko撰写。它是SQL领域分别向同一个ArrayList中添加元素。由于ArrayList不是线程安全的,当两个线程同时进行中的经典之作,提供了全面而深入的关于SQL语言和数据库设计的知识。书add操作时,可能导致数据的不一致性。 运行上述代码,你会发现每次输出的ArrayList中涵盖了SQL的各个方面,包括基本的查询语句、表的设计和创建、索引和的大小都不一致,这就是因为线程冲突导致的结果。 要解决ArrayList线程冲突优化技巧等等。它适用于初学者和有经验的数据库开发人员,帮助他们理解和掌握SQL的各种功能和用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值