Concurrency Go中的互斥锁问题
除了互斥外,一切都很好。在我锁定和解锁之后,它不会做任何事情。我有什么明显的遗漏吗 除此之外,解锁后,我想在这个函数中运行一个函数。我试着将其作为常规函数(timer())甚至(go timer())调用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(
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
时锁定互斥锁,当操作完成时解锁它'我们只对完成的
变量进行互斥修改。