用于旋转数字读取的线程安全收集

时间:2017-03-24 06:20:25

标签: c# multithreading

我想知道在C#中是否有一个内置的集合(或任何自定义集合)可用于以旋转/循环方式发出数字(参见下面的示例),并且是线程安全的(所以每个线程获取集合中的下一个数字。)

带有5个连续数字的集合: Thread 1 read: return value 1 Thread 2 read: return value 2 Thread 3 read: return value 3 Thread 4 read: return value 4 Thread 5 read: return value 5 Thread 6 read: return value 1 Thread 7 read: return value 2 Thread 8 read: return value 3 等等。

基本上,集合发出的下一个数字(当被一个线程读取时)应该是前一个后面的数字,它应该从数字集末尾的开头重新开始。

1 个答案:

答案 0 :(得分:0)

你可以改变一个方法,它将返回infinate enumerable:

// assign channels
std::vector<cv::Mat> ccs;
cv::Size ss(width, height);
float* data = blob->mutable_cpu_data();
for (int i = 0; i < channels; ++i) {
    cv::Mat channel(ss, CV_32FC1, data);
    ccs.push_back(channel);
    data += ss.area();
}
cv::Mat res,dst;
// merge them
cv::merge(ccs, res);
// optional add mean if needed
cv::normalize(res, dst, 0, 1, cv::NORM_MINMAX);
cv::namedWindow("Display window");
cv::imshow("Display window", dst);
cv::waitKey(0);

得到他们:

    private object _lock = new object();
    private int i = 0;
    private int max = 6;

    public IEnumerable<int> GetNumbers()
    {
        while (true)
        {
            lock (_lock)
            {
                i++;
                if (i == max)
                    i = 1;
                yield return i;
            }
        }

    }