Bagaimana untuk menyelesaikan kebuntuan (menunggu isyarat ujian gagal)

王林
Lepaskan: 2024-02-08 23:33:19
ke hadapan
690 orang telah melayarinya

Bagaimana untuk menyelesaikan kebuntuan (menunggu isyarat ujian gagal)

editor php Xiaoxin akan memperkenalkan kepada anda cara menyelesaikan masalah kebuntuan. Kebuntuan ialah masalah biasa dalam pengaturcaraan serentak berlaku apabila dua atau lebih proses menunggu satu sama lain untuk melepaskan sumber. Untuk menyelesaikan masalah ini, kita boleh menggunakan beberapa kaedah biasa, seperti menggunakan kunci mutex, mengelakkan persaingan sumber, menggunakan mekanisme tamat masa, dsb. Melalui reka bentuk dan pelarasan yang munasabah, kami boleh mengelakkan berlakunya kebuntuan dengan berkesan dan meningkatkan keselarasan dan kestabilan program. Seterusnya, mari kita lihat dengan lebih dekat cara menyelesaikan masalah kebuntuan!

Kandungan soalan

Saya mempunyai dua goroutine yang merupakan dua fungsi testxxx semasa ujian. Saya menggunakan pembolehubah keadaan untuk menyegerakkan goroutine ini. Walau bagaimanapun, apabila salah satu daripada ujian gagal, yang lain sedang menunggu isyarat. Kebuntuan akan datang. Juga, jika testfunctionb gagal, saya mahu testfunctiona juga gagal.

var cond sync.cond
func testfunctiona(t *testing.t){
   // ... some codes...
   cond.wait()
}
func testfunctionb(t *testing.t){
   // ... some codes...
   t.fail()
   // ... some codes...
   cond.broadcast()
}
Salin selepas log masuk

Saya telah mencuba beberapa kaedah, seperti:

var cond sync.Cond
var A_t *testing.T
func TestFunctionA(t *testing.T){
   // ... Some codes...
   A_t = t
   // ... Some codes...
   cond.Wait()
}
func TestFunctionB(t *testing.T){
   // ... Some codes...
   t.Cleanup(func(){
      if !A_t.Failed(){
          A_t.Fail()
      }
      cond.Broadcast()
   })
   t.Fail()
   // ... Some codes...
   cond.Broadcast()
}
Salin selepas log masuk

Tetapi apabila functionb tiada ralat, a_t.fail() masih akan dicetuskan.

Saya juga sedang mempertimbangkan untuk menggunakan context.context(). Walau bagaimanapun, saya tidak tahu cara menjalankan fungsi ujian dalam konteks. Terima kasih kerana membaca soalan saya! Saya menghargai sebarang komen atau perbincangan!

Penyelesaian

Satu ujian tidak sepatutnya berinteraksi dengan ujian lain. Walau bagaimanapun, apabila menggunakan subtests kita boleh berkongsi apa sahaja antara kes ujian.

Ini contohnya:

package main

import (
    "errors"
    "testing"
)

func TestFruits(t *testing.T) {
    var err error
    t.Run("test apple", getTestAppleFunc(&err))
    t.Run("test banana", getTestBananaFunc(&err))
}

func handleError(t *testing.T, err *error) {
    if err != nil && *err != nil {
        t.Error(*err)
    }
}

func getTestAppleFunc(err *error) func(*testing.T) {
    return func(t *testing.T) {
        handleError(t, err)
        *err = errors.New("Apple failed")
    }
}

func getTestBananaFunc(err *error) func(*testing.T) {
    return func(t *testing.T) {
        handleError(t, err)
    }
}
Salin selepas log masuk
  • Dalam fungsi gettestbananafuncgettestapplefunc penunjuk ralat diluluskan sebagai parameter.
  • Dalam contoh di atas, perkara pertama yang akan dilaksanakan ialah gettestapplefunc.
  • Jika tugasan dalam gettestapplefunc 中赋值错误(如上例所示),则 gettestbananafunc salah (seperti dalam contoh di atas), fungsi gettestbananafunc akan gagal.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan kebuntuan (menunggu isyarat ujian gagal). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!