关于 线程 同步 锁 的问题

ttsffgg 2016-02-11 03:31:39
最近在学习线程同步,遇到想不通的位置,恳请解惑,谢谢

假设情况如下

有1个对象O
有且只有100个功能F1至F100会调用对象O
现在要实现线程安全
经过分析后发现只有F1需要实现原子操作,也就是说:
*当有线程运行F1时,其它线程想要运行F1至F100中的任意功能都要被阻塞直至F1运行完毕;
*没有线程在运行F1时,任意个线程可以任意运行F2至F100,互不阻塞;

请问最简单有效的方法是什么?
...全文
172 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttsffgg 2016-02-15
  • 打赏
  • 举报
回复
引用 3 楼 gxmark 的回复:
建议直接在F1的功能函数或者方法中lock对象O
好像不行,在F1中lock对象O并不能阻止其它线程访问对象O
Poopaye 2016-02-12
  • 打赏
  • 举报
回复
别假设,有没有实际情况?否则就和考题一样,思考这个并没有什么卵用
gxmark 2016-02-11
  • 打赏
  • 举报
回复
建议直接在F1的功能函数或者方法中lock对象O
  • 打赏
  • 举报
回复
引用 楼主 overown 的回复:
最近在学习线程同步,遇到想不通的位置,恳请解惑,谢谢 假设情况如下 有1个对象O 有且只有100个功能F1至F100会调用对象O 现在要实现线程安全 经过分析后发现只有F1需要实现原子操作,也就是说: *当有线程运行F1时,其它线程想要运行F1至F100中的任意功能都要被阻塞直至F1运行完毕; *没有线程在运行F1时,任意个线程可以任意运行F2至F100,互不阻塞; 请问最简单有效的方法是什么?
既然你是在“学习”,那么贴出你学习的东西 url 地址来,一遍了解你到底学了点什么内容。你特意摘出这一段比较乱的文字,那么人家的进一步的具体的文字说明为什么不贴出呢?
john_QQ:2335298917 2016-02-11
  • 打赏
  • 举报
回复
你这个类似于读写锁,只有一个F1功能写入数据,F2至F100读取数据。 读写锁(ReadWriteLock) ReadWriteLock定义支持单个写线程和多个读线程的锁。该锁的作用主要是解决并发读的性能问题,使用该锁,可以大大提高数据并发访问的性能,只有在写时,才会阻塞所有的读锁。
using System.Collections.Generic;
using System.Windows;
using System.Threading;
 
 
namespace FYSTest
{
    public partial class MainWindow : Window
    {
        List<int> list = new List<int>();
        private ReaderWriterLock _rwlock = new ReaderWriterLock();
 
        public MainWindow()
        {
            InitializeComponent();
            Thread ThRead = new Thread(new ThreadStart(Read));
            ThRead.IsBackground = true;
            Thread ThRead2 = new Thread(new ThreadStart(Read));
            ThRead2.IsBackground = true;
            Thread ThWrite = new Thread(new ThreadStart(Write));
            ThWrite.IsBackground = true;
            ThRead.Start();
            ThRead2.Start();
            ThWrite.Start();
        }
 
        private void Read()
        {
            while (true)
            {
                //使用一个 System.Int32 超时值获取读线程锁。
                _rwlock.AcquireReaderLock(100);
                try
                {
                    if (list.Count > 0)
                    {
                        int result = list[list.Count - 1];
                    }
                }
                finally
                {
                    //减少锁计数,释放锁
                    _rwlock.ReleaseReaderLock();
                }
            }
        }
 
        int WriteCount = 0;//写次数
        private void Write()
        {
            while (true)
            {
                //使用一个 System.Int32 超时值获取写线程锁。
                _rwlock.AcquireWriterLock(100);
                try
                {
                    list.Add(WriteCount++);
                }
                finally
                {
                    //减少写线程锁上的锁计数,释放写锁
                    _rwlock.ReleaseWriterLock();
                }
            }
        }
    }
}

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧