线程同步概念

同步即协同步调,按预定的先后次序运行。

数据混乱原因:

1. 资源共享(独享资源则不会)

2. 调度随机(意味着数据访问会出现竞争)

3. 线程间缺乏必要的同步机制。

以上3点中,前两点不能改变,欲提高效率,传递数据,资源必须共享。只要共享资源,就一定会出现竞争。只要存在竞争关系,数据就很容易出现混乱。

所以只能从第三点着手解决。使多个线程在访问共享资源的时候,出现互斥。

举例1: 银行存款 5000。柜台,折:取3000;提款机,卡:取 3000。剩余:2000  (存款5000,同一时间点,两次取款分别3000,剩余2000.)

举例2: 内存中100字节,线程T1欲填入全1, 线程T2欲填入全0。但如果T1执行了50个字节失去cpu,T2执行,会将T1写过的内容覆盖。当T1再次获得cpu继续 从失去cpu的位置向后写入1,当执行结束,内存中的100字节,既不是全1,也不是全0。

产生的现象叫做“与时间有关的错误”(time related)。为了避免这种数据混乱,线程需要同步。

同步”的目的,是为了避免数据混乱,解决与时间有关的错误。实际上,不仅线程间需要同步,进程间、信号间等等都需要同步机制。

因此,所有“多个控制流,共同操作一个共享资源”的情况,都需要同步

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C# 中,线程并发和线同步是处理多线程编程中重要的概念线程并发指的是多个线程同时执行,这可能导致资源竞争和不确定的结果。为了避免这种情况,我们可以使用线同步机制来确保线程之间的协调和有序执行。 C# 提供了多种线同步的机制,下面是一些常用的方法: 1. 互斥锁(Mutex):互斥锁是一种排他锁,只允许一个线程访问被保护的资源。可以使用 `Mutex` 类来创建和管理互斥锁。 2. 信号量(Semaphore):信号量是一种计数器,用于控制同时访问某个资源的线程数。可以使用 `Semaphore` 类来创建和管理信号量。 3. 自旋锁(SpinLock):自旋锁是一种忙等待锁,线程会一直尝试获取锁,直到成功为止。可以使用 `SpinLock` 结构来创建和管理自旋锁。 4. 互斥量(Mutex):互斥量是一种特殊的信号量,只能被一个线程持有。可以使用 `Mutex` 类来创建和管理互斥量。 5. 事件(Event):事件是一种同步机制,在多个线程之间发送信号进行通信。可以使用 `ManualResetEvent` 或 `AutoResetEvent` 类来创建和管理事件。 除了上述方法外,还有一些其他的线同步机制,如读写锁(ReaderWriterLock)、条件变量(Monitor)等。选择适合场景的线同步机制很重要,以确保线程安全和性能。 需要注意的是,线程并发和线同步是一个复杂的主题,需要深入学习和实践才能掌握。在编写多线程代码时,建议仔细考虑并发问题,并使用适当的线同步机制来确保代码的正确性和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值