Concurrency Go中的互斥锁问题

Concurrency Go中的互斥锁问题,concurrency,go,mutex,goroutine,Concurrency,Go,Mutex,Goroutine,除了互斥外,一切都很好。在我锁定和解锁之后,它不会做任何事情。我有什么明显的遗漏吗 除此之外,解锁后,我想在这个函数中运行一个函数。我试着将其作为常规函数(timer())甚至(go timer())调用 func屏蔽(状态*state){ 对于s:=range state.ToggleShield{//在通道上运行数据时运行 如果s==true{//如果通道上的数据为true fmt.Println(“打开防护罩,这是不可中断的。请稍候…”) state.VariableMutex.Lock(

除了互斥外,一切都很好。在我锁定和解锁之后,它不会做任何事情。我有什么明显的遗漏吗

除此之外,解锁后,我想在这个函数中运行一个函数。我试着将其作为常规函数(timer())甚至(go timer())调用

func屏蔽(状态*state){
对于s:=range state.ToggleShield{//在通道上运行数据时运行
如果s==true{//如果通道上的数据为true
fmt.Println(“打开防护罩,这是不可中断的。请稍候…”)
state.VariableMutex.Lock()
state.Finished=false//禁用其他命令
state.VariableMutex.Unlock()
fmt.Println(“移动!!”)
股票代码:=时间.勾选(时间.秒)
对于i:=10;i>=0;i--{

“go”语句将函数调用的执行作为 控件内的独立并发控制线程或goroutine 相同的地址空间

函数值和参数在 调用goroutine,但与常规调用不同,程序执行 不等待调用的函数完成 函数开始在新goroutine中独立执行 函数终止,其goroutine也终止

您的程序似乎没有适当的机制来等待goroutines完成:“程序执行不会等待调用的函数完成。”为了演示这一点,我在程序
main
函数的末尾插入了一个粗略的等待机制:

// wait for a while to give goroutines a chance to complete
time.Sleep(5 * time.Second)
节目:

输出:

Toggling Shield
Opening the shields This is uninteruptable. Please wait...
Move!!

On 10/10
On 10/9
On 10/8
On 10/7
On 10/6

Program exited.

“go”语句将函数调用的执行作为 控件内的独立并发控制线程或goroutine 相同的地址空间

函数值和参数在 调用goroutine,但与常规调用不同,程序执行 不等待调用的函数完成 函数开始在新goroutine中独立执行 函数终止,其goroutine也终止

您的程序似乎没有适当的机制来等待goroutines完成:“程序执行不会等待调用的函数完成。”为了演示这一点,我在程序
main
函数的末尾插入了一个粗略的等待机制:

// wait for a while to give goroutines a chance to complete
time.Sleep(5 * time.Second)
节目:

输出:

Toggling Shield
Opening the shields This is uninteruptable. Please wait...
Move!!

On 10/10
On 10/9
On 10/8
On 10/7
On 10/6

Program exited.

你能提供一个最小的编译代码段吗?另外,请尝试一下,它有点混乱,因为我正在处理它,但这似乎不是最小的,一个问题是“肉”不管怎么说,这肯定是问题本身。我不确定你是否理解你想做什么,但也许你不应该使用这个
Finished
变量,而应该将整个操作置于互斥状态,即:
Lock
当你设置
Finished=true
时锁定互斥锁,当操作完成时解锁它“我们只对
完成的
变量进行互斥修改。您能提供一个最小的编译代码段吗?另外,尝试一下,它有点乱,因为我正在处理它,但这似乎不是最小的,而且是一个问题的“肉”不管怎么说,这肯定是问题本身。我不确定你是否理解你想做什么,但也许你不应该使用这个
Finished
变量,而应该将整个操作置于互斥状态,即:
Lock
当你设置
Finished=true
时锁定互斥锁,当操作完成时解锁它'我们只对
完成的
变量进行互斥修改。