


Why does the code with locks occasionally cause panic: send on closed channel?
Apr 02, 2025 am 11:39 AM Analysis of the reason why the Go language lock code occasionally appears panic: send on closed channel
In Go concurrent programming, it is common to use locks (mutex) to ensure thread safety, but even if locks are used, you may still encounter panic: send on closed channel
errors. This article analyzes the causes and solutions for this problem.
Problem code and phenomenon
The following code snippet demonstrates the problem:
package main import ( "context" "fmt" "sync" ) var lock sync.Mutex func main() { c := make(chan int, 10) wg := sync.WaitGroup{} ctx, cancel := context.WithCancel(context.Background()) wg.Add(1) go func() { defer wg.Done() lock.Lock() cancel() close(c) lock.Unlock() }() for i := 0; i <p> Although <code>lock.Lock()</code> and <code>lock.Unlock()</code> are used to protect the critical section, the program may still panic at <code>c because of the nondeterministic behavior of <code>select</code> statement.</code></p><h4> Problem analysis</h4><p> The Go language <code>select</code> statement is non-deterministic: if multiple cases are ready to be received or sent, <code>select</code> will randomly select one execution.</p><p> The key is:</p><ol> <li><p> <strong>Competition between <code>close(c)</code> and <code>c :</code></strong> <code>close(c)</code> and <code>c operations are not atomic operations, there are race conditions. Even if lock is added, the <code>close(c)</code> operation may be performed after <code>c operation, causing <code>c to attempt to send data to the closed channel, thereby causing panic.</code></code></code></p></li> <li><p> <strong>Randomity of <code>select</code> statement:</strong> even if <code>ctx.Done()</code> is ready, <code>select</code> may still randomly select <code>c to execute.</code></p></li> </ol><h4> Solution</h4><p> To avoid this problem, you need to make sure that the channel is closed before sending the data. You can use the default case of <code>select</code> statement to implement it:</p><pre class="brush:php;toolbar:false"> select { case c <p> Alternatively, use an extra channel to coordinate the shutdown operation:</p><pre class="brush:php;toolbar:false"> package main import ( "fmt" "sync" ) func main() { c := make(chan int, 10) done := make(chan struct{}) wg := sync.WaitGroup{} wg.Add(1) go func() { defer wg.Done() close(done) // Signal that the channel is closing close(c) }() for i := 0; i <p> This improved version uses the <code>done</code> channel to notify the goroutine channel to be closed soon, avoiding race conditions.</p><p> Through the above method, <code>panic: send on closed channel</code> error can be effectively avoided, even if locks are used in concurrent environments. Which solution to choose depends on the specific application scenario and code complexity.</p>
The above is the detailed content of Why does the code with locks occasionally cause panic: send on closed channel?. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

As the market conditions pick up, more and more smart investors have begun to quietly increase their positions in the currency circle. Many people are wondering what makes them take decisively when most people wait and see? This article will analyze current trends through on-chain data to help readers understand the logic of smart funds, so as to better grasp the next round of potential wealth growth opportunities.

The pattern in the public chain field shows a trend of "one super, many strong ones, and a hundred flowers blooming". Ethereum is still leading with its ecological moat, while Solana, Avalanche and others are challenging performance. Meanwhile, Polkadot, Cosmos, which focuses on interoperability, and Chainlink, which is a critical infrastructure, form a future picture of multiple chains coexisting. For users and developers, choosing which platform is no longer a single choice, but requires a trade-off between performance, cost, security and ecological maturity based on specific needs.

Cardano's Alonzo hard fork upgrade has successfully transformed Cardano from a value transfer network to a fully functional smart contract platform by introducing the Plutus smart contract platform. 1. Plutus is based on Haskell language, with powerful functionality, enhanced security and predictable cost model; 2. After the upgrade, dApps deployment is accelerated, the developer community is expanded, and the DeFi and NFT ecosystems are developing rapidly; 3. Looking ahead to 2025, the Cardano ecosystem will be more mature and diverse. Combined with the improvement of scalability in the Basho era, the enhancement of cross-chain interoperability, the evolution of decentralized governance in the Voltaire era, and the promotion of mainstream adoption by enterprise-level applications, Cardano has

The top 20 most promising crypto assets in 2025 include BTC, ETH, SOL, etc., mainly covering multiple tracks such as public chains, Layer 2, AI, DeFi and gaming. 1.BTC continues to lead the market with its digital yellow metallicity and popularization of ETFs; 2.ETH consolidates the ecosystem due to its position and upgrade of smart contract platforms; 3.SOL stands out with high-performance public chains and developer communities; 4.LINK is the leader in oracle connecting real data; 5.RNDR builds decentralized GPU network service AI needs; 6.IMX focuses on Web3 games to provide a zero-gas-free environment; 7.ARB leads with mature Layer 2 technology and huge DeFi ecosystem; 8.MATIC has become the value layer of Ethereum through multi-chain evolution

The core difference between USDC, DAI and TUSD lies in the issuance mechanism, collateral assets and risk characteristics. 1. USDC is a centralized stablecoin issued by Circle and is collateralized by cash and short-term treasury bonds. Its advantages are compliance and transparent, strong liquidity, and high stability, but there is a risk of centralized review and single point failure; 2. DAI is a decentralized stablecoin, generated through the MakerDAO protocol, and the collateral is a crypto asset. It has the advantages of anti-censorship, transparency on chain, and permission-free, but it also faces systemic risks, dependence on centralized assets and complexity issues; 3. TUSD is a centralized stablecoin, emphasizing real-time on-chain reserve proof, providing higher frequency transparency verification, but has a small market share and weak liquidity. The three are collateral types and decentralization

At a time when the digital economy wave swept the world, cryptocurrencies have become the focus of attention from all walks of life with their unique decentralization and transparency. From the initial geek niche experiment to the current financial landscape with a market value of trillions, the evolution of cryptocurrencies is amazing. It not only brings innovations in underlying technologies, but also gives birth to countless innovative applications, which are profoundly affecting all aspects of finance, technology and even social governance.

Recently, the discussion in the digital asset field has remained hot. Dogecoin DOGE, as one of the most popular focus, has become a question that many people have explored. Where does it "settling down"? What is the relationship with the current leading trading platform, Binance? To answer these questions, we need to conduct in-depth analysis from the two dimensions of the underlying technical logic of digital assets and the platform ecology, rather than just staying in appearance.

Whether ordinary people can make money by participating in the cryptocurrency market depends on multiple factors, and opportunities and risks coexist. This article introduces mainstream projects such as Bitcoin, Ethereum, Solana, BNB and Cardano. The highlights are market consensus, smart contract ecosystem, high-performance public chains, platform resource support and technical rigor; potential opportunities include high growth potential, technological innovation and low entry threshold, but risks are also significant, such as large price fluctuations, technical complexity, security issues and regulatory uncertainty; for beginners, it is recommended to follow the following steps: 1. Independent research (DYOR); 2. Select a reliable trading platform; 3. Complete identity verification; 4. Small batch investment; 5. Learn to keep assets safely. Overall, the cryptocurrency market has potential, but it needs to be treated with caution
