Table of Contents
Question content
Solution
Home Backend Development Golang Why does the following go program give a deadlock error 'Fatal error: All goroutines are sleeping - deadlock!'

Why does the following go program give a deadlock error 'Fatal error: All goroutines are sleeping - deadlock!'

Feb 09, 2024 am 08:00 AM
go language

为什么下面的 go 程序会出现死锁错误“致命错误:所有 goroutine 都在睡眠 - 死锁!”

In the Go language, deadlock is a common error. When all goroutines are sleeping, a fatal error will occur: "Fatal error: All goroutines are sleeping. - Deadlock!". This situation usually occurs when multiple goroutines are waiting for each other. When one goroutine waits for another goroutine to complete an operation, and another goroutine waits for the first goroutine to complete an operation, a deadlock occurs. In this case, the program cannot continue to execute because all goroutines cannot continue to execute. In order to avoid deadlock errors, we need to carefully design and manage the dependencies between goroutines to ensure that they can work together correctly.

Question content

I am new to golang and am trying to use some typical producer consumers of channels. I understand that both producer and consumer should write and read from the same channel. But just for experimenting, I made them write and read from different channels as shown below

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

package main

     

    import (

        "fmt"

        "sync"

    )

     

    func main() {

     

        var wg sync.WaitGroup

        wg.Add(2)

     

        fmt.Println("Starting the main application")

     

        channel :=make( chan int)

        channel1 :=make( chan int)

     

     

        go generateNumbersV2(&wg, channel)

        go printNumbersV2(&wg, channel1)

     

     

        fmt.Println("Waiting for other goroutines")

        wg.Wait()

        //close()

        //close(channel)

     

        fmt.Println("All goroutines finished")

    }

     

    func printNumbersV2(wg *sync.WaitGroup, rc <-chan int) {

        defer wg.Done()

     

        for idx:=0 ;idx<3;idx++ {

     

            val := <-rc

            fmt.Println("******value received from channel ",val)

        }

    }

     

    func generateNumbersV2(wg *sync.WaitGroup, wc chan<- int) {

        defer wg.Done()

     

        for idx:=0 ;idx<3;idx++ {

     

             wc<-idx

            fmt.Println("###value written to channel ",idx)

        }

     

    }

Copy after login

When I run the program, I get the following error.

1

fatal error: all goroutines are asleep - deadlock!

Copy after login

Now, although I know that both goroutines are blocked, one on the read call to channel 1 and the other on the write call to channel, so the program never terminates. But my question is, if it is actually waiting for a value in these channels, shouldn't the program wait indefinitely instead of declaring it a deadlock? What if later due to some network read/write, the values ​​arrive and some other go routine writes to these channels?

Solution

A running program will terminate due to a deadlock panic only when all goroutines are blocked on synchronization primitives. If all goroutines are blocked waiting for channel operations and/or mutex locks, network reception is not possible because no goroutine is listening for network connections. This also means that in a program with many goroutines, you may have many groups of deadlocked goroutines, but the program still continues to run because there are other goroutines that can still continue to run.

The above is the detailed content of Why does the following go program give a deadlock error 'Fatal error: All goroutines are sleeping - deadlock!'. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
1 months ago By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What is the problem with Queue thread in Go's crawler Colly? What is the problem with Queue thread in Go's crawler Colly? Apr 02, 2025 pm 02:09 PM

Queue threading problem in Go crawler Colly explores the problem of using the Colly crawler library in Go language, developers often encounter problems with threads and request queues. �...

What libraries are used for floating point number operations in Go? What libraries are used for floating point number operations in Go? Apr 02, 2025 pm 02:06 PM

The library used for floating-point number operation in Go language introduces how to ensure the accuracy is...

How to solve the problem that custom structure labels in Goland do not take effect? How to solve the problem that custom structure labels in Goland do not take effect? Apr 02, 2025 pm 12:51 PM

Regarding the problem of custom structure tags in Goland When using Goland for Go language development, you often encounter some configuration problems. One of them is...

Which libraries in Go are developed by large companies or provided by well-known open source projects? Which libraries in Go are developed by large companies or provided by well-known open source projects? Apr 02, 2025 pm 04:12 PM

Which libraries in Go are developed by large companies or well-known open source projects? When programming in Go, developers often encounter some common needs, ...

Why is it necessary to pass pointers when using Go and viper libraries? Why is it necessary to pass pointers when using Go and viper libraries? Apr 02, 2025 pm 04:00 PM

Go pointer syntax and addressing problems in the use of viper library When programming in Go language, it is crucial to understand the syntax and usage of pointers, especially in...

How to implement operations on Linux iptables linked lists in Golang? How to implement operations on Linux iptables linked lists in Golang? Apr 02, 2025 am 10:18 AM

Using Golang to implement Linux...

In Go, why does printing strings with Println and string() functions have different effects? In Go, why does printing strings with Println and string() functions have different effects? Apr 02, 2025 pm 02:03 PM

The difference between string printing in Go language: The difference in the effect of using Println and string() functions is in Go...

Go language is inefficient in processing massive URL access, how to optimize it? Go language is inefficient in processing massive URL access, how to optimize it? Apr 02, 2025 am 10:15 AM

Performance optimization strategy for Go language massive URL access This article proposes a performance optimization solution for the problem of using Go language to process massive URL access. Existing programs from CSV...

See all articles