代码之家  ›  专栏  ›  技术社区  ›  Jaswant Agarwal

如何使用AOP在C中的不同线程之间共享数据?

  •  27
  • Jaswant Agarwal  · 技术社区  · 15 年前

    如何在不使用静态变量的情况下在C中的不同线程之间共享数据? 我们能用属性创造一个这样的男权主义吗?

    在这种情况下,面向方面的编程有帮助吗?

    为了实现这一点,所有不同的线程都应该在单个对象上工作?

    4 回复  |  直到 15 年前
        1
  •  6
  •   Franci Penov    15 年前

    可以将对象作为参数传递给 Thread.Start 并将其用作当前线程和启动线程之间的共享数据存储。

    如果您使用 ThreadStart 代表。

    不能使用属性在线程之间创建共享数据。您可以将附加到类的属性实例用作数据存储,但我看不到这比使用静态或实例数据成员更好。

        2
  •  18
  •   ChaosPandion    15 年前

    您无法克服锁定消息队列的简单性。我说不要把时间浪费在更复杂的事情上。

    读上 语句。

    lock

    编辑

    下面是一个打包的Microsoft队列对象的示例,因此针对它的所有操作都是线程安全的。

    public class Queue<T>
    {
        /// <summary>Used as a lock target to ensure thread safety.</summary>
        private readonly Locker _Locker = new Locker();
    
        private readonly System.Collections.Generic.Queue<T> _Queue = new System.Collections.Generic.Queue<T>();
    
        /// <summary></summary>
        public void Enqueue(T item)
        {
            lock (_Locker)
            {
                _Queue.Enqueue(item);
            }
        }
    
        /// <summary>Enqueues a collection of items into this queue.</summary>
        public virtual void EnqueueRange(IEnumerable<T> items)
        {
            lock (_Locker)
            {
                if (items == null)
                {
                    return;
                }
    
                foreach (T item in items)
                {
                    _Queue.Enqueue(item);
                }
            }
        }
    
        /// <summary></summary>
        public T Dequeue()
        {
            lock (_Locker)
            {
                return _Queue.Dequeue();
            }
        }
    
        /// <summary></summary>
        public void Clear()
        {
            lock (_Locker)
            {
                _Queue.Clear();
            }
        }
    
        /// <summary></summary>
        public Int32 Count
        {
            get
            {
                lock (_Locker)
                {
                    return _Queue.Count;
                }
            }
        }
    
        /// <summary></summary>
        public Boolean TryDequeue(out T item)
        {
            lock (_Locker)
            {
                if (_Queue.Count > 0)
                {
                    item = _Queue.Dequeue();
                    return true;
                }
                else
                {
                    item = default(T);
                    return false;
                }
            }
        }
    }
    

    编辑2

    我希望这个例子有帮助。 记住这是赤裸裸的。 使用这些基本思想,您可以安全地利用线程的功能。

    public class WorkState
    {
        private readonly Object _Lock = new Object();
        private Int32 _State;
    
        public Int32 GetState()
        {
            lock (_Lock)
            {
                return _State;
            }
        }
    
        public void UpdateState()
        {
            lock (_Lock)
            {
                _State++;   
            }   
        }
    }
    
    public class Worker
    {
        private readonly WorkState _State;
        private readonly Thread _Thread;
        private volatile Boolean _KeepWorking;
    
        public Worker(WorkState state)
        {
            _State = state;
            _Thread = new Thread(DoWork);
            _KeepWorking = true;                
        }
    
        public void DoWork()
        {
            while (_KeepWorking)
            {
                _State.UpdateState();                   
            }
        }
    
        public void StartWorking()
        {
            _Thread.Start();
        }
    
        public void StopWorking()
        {
            _KeepWorking = false;
        }
    }
    
    
    
    private void Execute()
    {
        WorkState state = new WorkState();
        Worker worker = new Worker(state);
    
        worker.StartWorking();
    
        while (true)
        {
            if (state.GetState() > 100)
            {
                worker.StopWorking();
                break;
            }
        }                   
    }
    
        3
  •  7
  •   djna    15 年前

    请看下面的示例代码:

    public class MyWorker
    {
        public SharedData state;
        public void DoWork(SharedData someData)
        {
            this.state = someData;
            while (true) ;
        }
    
    }
    
    public class SharedData {
        X myX;
        public getX() { etc
        public setX(anX) { etc
    
    }
    
    public class Program
    {
        public static void Main()
        {
            SharedData data = new SharedDate()
            MyWorker work1 = new MyWorker(data);
            MyWorker work2 = new MyWorker(data);
            Thread thread = new Thread(new ThreadStart(work1.DoWork));
            thread.Start();
            Thread thread2 = new Thread(new ThreadStart(work2.DoWork));
            thread2.Start();
        }
    }
    

    在这种情况下,线程类 MyWorker 有一个变量 state . 我们用 相同的 对象。现在您可以看到两个工人访问 相同的 SharedData对象。一个工人所做的更改对另一个工人可见。

    你还有很多问题要处理。2号工人怎么知道 什么时候? 工人1进行了更改,反之亦然?如何防止冲突的更改?也许读: this tutorial .

        4
  •  3
  •   djna    15 年前

    当您启动一个线程时,您正在执行某个选定类的方法。该类的所有属性都可见。

      Worker myWorker = new Worker( /* arguments */ );
    
      Thread myThread = new Thread(new ThreadStart(myWorker.doWork));
    
      myThread.Start();
    

    您的线程现在位于dowork()方法中,可以看到myworker的任何属性,这些属性本身可能是其他对象。现在您只需要小心处理几个线程同时访问这些属性的情况。