Unity - A计划(永久有效期) 扫二维码继续学习 二维码时效为半小时

(196评价)
价格: 4019.00元
多线程中的资源竞争问题
小明发起了问答2016-11-23
5
回复
667
浏览
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Threading;

public class Test : MonoBehaviour {

    //用来存储数值的List数组
    private List<int> intList = new List<int>();

    void Start()
    {
        //给intList赋初始值1~10
        for (int i = 1; i <= 10; i++)
        {
            intList.Add(i);
        }
        //开启3个线程
        Thread x1 = new Thread(XC1);
        x1.Start();
        Thread x2 = new Thread(XC2);
        x2.Start();
        Thread x3 = new Thread(XC3);
        x3.Start();
    }
    //线程1,用来输出intList内的所有值
    void XC1()
    {
        lock (intList)
        {
            for (int i = 0; i < intList.Count; i++)
            {
                print("线程1输出:" + intList[i]);
                Thread.Sleep(500);
            }
        }
        print("线程1结束");
    }
    //线程2,和线程1一样,用来输出intList的所有值
    void XC2()
    {
        lock (intList)
        {
            for (int i = 0; i < intList.Count; i++)
            {
                print("线程2输出" + intList[i]);
                Thread.Sleep(250);
            }
        }
        print("线程2结束");
    }
    //线程3,用来删除intList内的某个值
    void XC3()
    {
        lock (intList)
        {
            Thread.Sleep(600);
            intList.RemoveAt(7);
            print("删除一个值");
        }
    }
}

我在线程1和线程2中用for循环去访问intList中的值,但我希望在线程3中去删除intList中的值的时候不影响到线程1和线程2的输出,于是我加了Lock锁,但是现在问题又来了,加了锁之后线程1和线程2就不是异步执行了,这种情况应该怎么办?

我希望线程1和线程2异步执行并完好的输出intList中的值,线程3在没有人引用intList的时候再去删除intList中的值。

所有回复
  • siki 2016-11-23

    加了锁之后线程1和线程2也是在异步执行,只是线程暂停了,等待解锁而已

     

     

    • 小明 2016-11-23

      可是,我在读取数组中的值的时候,不希望线程1和线程2任一一个会暂停,只希望在删除的时候,保证没有人在读取数组值得时候再删除,应该怎么做呢?现在的情况是,线程1输出完了,然后线程2再接着输出,最后线程3再去删除。

      (0) 回复
    • siki 2016-11-23

      回复 @ 小明: 你是用多线程,对于同一个对象来说,同一时间只能被一个线程访问,这个是必须的

      (0) 回复
    • 小明 2016-11-24

      回复 @ siki: 可是,多线程中应该是线程1正在读取数组的时候(还没读取完),线程2一样可以读取这个数组吗?可是现在是线程2得等线程1读完了,然后才开始读,那这跟单线程不是没啥区别了。。

      (0) 回复
    • siki 2016-11-24

      回复 @ 小明: lock是互斥锁,不管是读取还是写入 都是互相阻塞的 如果你想让读取的线程互相之间不阻塞的话,可以使用读写锁 http://www.2cto.com/kf/201401/274446.html

      (0) 回复
    还有-1条回复,点击查看
    你还没有登录,请先登录注册
发表回复
你还没有登录,请先 登录或 注册!