【问题标题】:Running two functions concurrently同时运行两个函数
【发布时间】:2017-07-26 09:10:31
【问题描述】:

我想一个接一个地运行两个函数来访问第三个函数,条件是当第一个函数使用第三个函数时,第二个函数应该等待。在第一次访问第三个函数的时间段结束后应该可以使用第三个函数了。

这个概念听起来像是通过上下文切换实现循环调度。我理论上知道这一点,但我想实际应用它。我怎样才能做到这一点并进行上下文切换?有人可以给我一个例子来做到这一点吗?还有其他方法可以实现吗?

编辑:实际上我正在使用 gmap.net 在谷歌地图上绘制标记。我为这两个标记创建了两个线程函数。它们将从两个单独的文件中获取所需的数据。将其转换为 lat long 并绘制map.with 这种方法,我正在为具有相同功能的两个函数创建重复的函数。但我想这不是一种好的编程方式,所以我想使用一个通用函数来绘制和从文件中获取数据以进行转换。

所以当一个线程正在访问公共函数时,另一个线程应该等待。一旦第一个线程释放该函数或超过它在该函数上工作的时间段,它应该执行上下文切换,第二个线程应该访问公共函数。 这就是我想要实现的。如果我应该修改我的方法,请告诉我。

【问题讨论】:

  • 请详细说明你的意思,也许用伪代码写出来,或者给出一个流程图应该是怎样的,因为这个文本块对我没有多大帮助
  • 改写您的问题,使其更易于阅读,并添加一些您尝试过的代码等。
  • @Icepickle 请找到更新后的问题..
  • @JoshuaBakker 先生,请找到更新后的问题

标签: c# multithreading context-switch round-robin


【解决方案1】:

听起来像 2 个带锁的任务应该做你想做的事:

class Program
{
    static void Main(string[] args)
    {
        var task1 = Task.Run(() => Func1());
        var task2 = Task.Run(() => Func2());

        Task.WaitAll(task1, task2);
    }

    static object lockObj = new object();

    static void Func1()
    {
        for (int i = 0; i < 10; i++)
        {
            Func3("Func1");
            Thread.Sleep(1);
        }
    }

    static void Func2()
    {
        for (int i = 0; i < 10; i++)
        {
            Func3("Func2");
            Thread.Sleep(1);
        }
    }

    static void Func3(string fromFn)
    {
        lock(lockObj)
        {
            Console.WriteLine("Called from " + fromFn);
        }
    }
}

锁防止封闭的代码一次在多个线程中运行。 (Sleep 语句纯粹是为了演示目的而减慢函数速度 - 它们不会在您的最终代码中占有一席之地。

输出是:

Called from Func2
Called from Func1
Called from Func2
Called from Func1
Called from Func2
Called from Func1
Called from Func1
Called from Func2
Called from Func1
Called from Func2

【讨论】:

  • 这不一定符合 OP 的要求。无法保证这两种功能会均匀交替。
  • @InBetween: 嗯...我在要求中没有看到任何指定“偶数”的内容。但这个问题在那个领域并不十分清楚。 :)
  • 不是,而是 “我想一个接一个地运行两个函数...” 让我感到奇怪,因此评论很清楚你的解决方案没有执行它。除此之外,这是一个很好的答案。
  • @InBetween:公平点。是否合适取决于问题中没有的细节。希望这是我们所需要的。
  • @Baldrick 先生,如果我在 func1 和 func2 上包含时间限制,他们只能在一定的时间间隔内访问 func 3,如果其中任何一个超过限制上下文切换应该发生,以便下次函数从它停止的最后位置恢复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 2021-07-20
  • 1970-01-01
相关资源
最近更新 更多