前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用自旋算法实现“两个线程轮流打印0到100奇偶数?”

使用自旋算法实现“两个线程轮流打印0到100奇偶数?”

作者头像
有态度的马甲
发布2022-03-30 21:04:59
3210
发布2022-03-30 21:04:59
举报
文章被收录于专栏:精益码农精益码农

两个线程轮流打印0到100奇偶数?

前文通过《go信道/C#自动重置事件的方式》对两个线程进行了通信, 网上有人不依赖(线程同步)自行完成了该题, 我觉得这种方法很巧妙。

本次循环不该打印时,让线程代码自旋;等待另外的线程递增而引起本线程再次进入业务代码。

代码语言:javascript
复制
volatile static int i = 0;
public static void Main(String[] args)
        {
            Thread thread1 = new Thread(() =>
            {
                while (i <= 100)
                {
                    if (i % 2 == 0)
                    {
                        Console.WriteLine(i + "== 偶数");
                        i++;
                    }
                }
            });
            Thread thread2 = new Thread(() =>
            {
                while (i <= 100)
                {
                    if (i % 2 ==1  )
                    {
                        Console.WriteLine(i + "== 奇数");
                        i++;
                    }
                }
            });
            thread1.Start();
            thread2.Start();
            Console.ReadKey();
        }

翻译成golang

因为go不支持while 和do-while语法,可以通过for关键字来实现:

即break在业务代码执行前相当与while,break在业务代码执行后相当do...while。

代码语言:javascript
复制
package main

import (
 "fmt"
 "strconv"
 "sync"
)

var wg sync.WaitGroup
var i int = 0

func main() {
 wg.Add(2)
 go func() {
  defer wg.Done()
  for {
   if i > 100 {
    break
   }
   if i%2 == 0 {
    fmt.Println("g0:  " + strconv.Itoa(i))
    i++
   }
  }
 }()

 go func() {
  defer wg.Done()
  for {
   if i > 100 {
    break
   }
   if i%2 == 1 {
    fmt.Println("g1: " + strconv.Itoa(i))
    i++
   }
  }
 }()

 wg.Wait()
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 精益码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 翻译成golang
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档