C ++ 实现#include <iostream>#include <thread>#include <condition_variable>#include <mutex>using namespace std;mutex mut;  // 定义互斥量condition_variable cond1, cond2;  // 定义两个条件变量,不同线程等待不同的条件变量int num = 1;void thread1() { while (num <= 10) {  unique_lock<mutex> locker(mut); // 使用 unique_lock 锁管理类,自动上锁和解锁  cout << "thread1: " << num << endl;  num++;  cond2.notify_one(); // 线程 1 打印完成,通知线程 2 打印  cond1.wait(locker); // 等待线程 2 打印完成再继续打印 }}void thread2() { while (num <= 10) {  unique_lock<mutex> locker(mut);  cout << "thread2: " << num << endl;  num++;  cond1.notify_one();  cond2.wait(locker); }}int main() { thread t1(thread1);  // 定义两个线程 thread t2(thread2); t1.join();  // 回收线程资源 t2.join();  system("pause"); return 0;}思路:两个线程分别使用两个不同的条件变量控制,共同等待用一个互斥量,从而实现交替打印的效果Go 实现 1package mainimport ( "fmt" "sync")const ( MAX     = 10 // 最大打印到多少 GoCount = 2   // 同时执行的线程数)func main() { fmt.Println(Solution(MAX, GoCount))}func Solution(MAX int, GoCount int) []int { wg := sync.WaitGroup{} wg.Add(GoCount) res := make([]int, 0) count := 1 for i := 0; i < GoCount; i++ {  go func(k int) { // 注意需要传递参数到协程内   for {    now := count    if now > MAX {     wg.Done()     return    }    // 这条语句保证任务均匀地分配到所有的协程       // now 是当前的任务编号,GoCount 是协程的数量,k 是当前协程的编号。    if now%GoCount == k {     res = append(res, now)     count++    }   }  }(i) } wg.Wait() return res}Go 实现 2package mainimport (    "fmt"    "sync")func main() {    var wg sync.WaitGroup    wg.Add(2)    ch1 := make(chan bool)    ch2 := make(chan bool)    go func() {        count := 1        for count < 10 {            <-ch1            fmt.Println("groutine 1: ", count)            count = count + 2            ch2 <- true        }        wg.Done()    }()    go func() {        count := 2        for count <= 10 {            <-ch2            fmt.Println("groutine 2: ", count)            count = count + 2            if count <= 10 {                ch1 <- true            }        }        wg.Done()    }()    ch1 <- true    wg.Wait()}思路:两个 channel 分别控制两个协程,两个 count 计数避免资源竞争
点赞 3
评论 0
全部评论

相关推荐

gelmanspar...:奖学金删掉,自我评价删掉,简历压缩一下,写一页
如果再来一次,你还会学机...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务