一、练习题
1. 设计四个线程对象,给定两个整数,两个线程执行减操作,两个线程执行加操作,减法操作减到0为止,加法操作加到100为止。
package Study // 导包 import std.sync.* // 加法 var number1 = 0 // 减法 var number2 = 100 // 可重入互斥锁 let mutex = Mutex() // 加法 func add() { while (true) { synchronized (mutex) { if (number1 >= 100) { println("${Thread.currentThread.id}: 已达到上限100, 停止加法操作"); break; } number1++; println("${Thread.currentThread.id}: 加1, number1值=${number1}"); } } } // 减法 func sub() { while (true) { synchronized (mutex) { if (number2 <= 0) { println("${Thread.currentThread.id}: 已达到下限0, 停止减法操作"); break; } number2--; println("${Thread.currentThread.id}: 减1, number2=${number2}"); } } } main () { let future1 = spawn { add() } let future2 = spawn { add() } let future3 = spawn { sub() } let future4 = spawn { sub() } future1.get() future2.get() future3.get() future4.get() }2. 模拟卖票,有100张票,200个买家,确保所有票都可以被正常卖出(用原子操作实现)。
package Study // 导包 import std.sync.* import std.collection.* // 票数 var ticket = AtomicInt64(100) let list = ArrayList<Future<Unit>>() main () { // 创建200个线程 for (_ in 0..200) { let future = spawn { if (ticket.load() > 0) { ticket.fetchSub(1) println("买家${Thread.currentThread.id}已成功购买一张票, 剩余票数: ${ticket.load()}") } } list.add(future) } for (future in list) { future.get() } println("票已售空") }3. 模拟卖票,有100张票,200个买家,确保所有票都可以被正常卖出(用多线程通信Semaphore实现)。
package Study // 导包 import std.sync.* import std.collection.* // 票数 var ticket = 100 let semaphore = Semaphore(1) let list = ArrayList<Future<Unit>>() main () { // 创建200个线程 for (_ in 0..200) { let future = spawn { // 获取 semaphore.acquire() if (ticket > 0) { ticket-- println("买家${Thread.currentThread.id}已成功购买一张票, 剩余票数: ${ticket}") } // 释放 semaphore.release() } list.add(future) } for (future in list) { future.get() } println("票已售空") }二、小结
本章为大家详细的介绍了仓颉编程语言中多线程练习题的内容,下一章,为大家带来宏的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉服务端开发有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!