Wie können Zugriffskonflikte auf gemeinsam genutzte Ressourcen gelöst werden?

WBOY
Freigeben: 2024-02-09 22:03:08
nach vorne
1092 Leute haben es durchsucht

Wie können Zugriffskonflikte auf gemeinsam genutzte Ressourcen gelöst werden?

Der PHP-Editor Strawberry stellt Ihnen vor, wie Sie das Zugriffskonfliktproblem gemeinsam genutzter Ressourcen lösen können. Wenn bei der Multithread- oder Multiprozessprogrammierung mehrere Threads oder Prozesse gleichzeitig auf gemeinsam genutzte Ressourcen zugreifen, kann es zu Dateninkonsistenzen oder fehlerhaften Ergebnissen kommen. Um dieses Problem zu lösen, können Synchronisationsmechanismen wie Mutexe, Semaphore und Bedingungsvariablen verwendet werden, um einen sich gegenseitig ausschließenden Zugriff auf Ressourcen sicherzustellen. Durch den rationalen Einsatz dieser Synchronisationsmechanismen können wir das Problem von Zugriffskonflikten gemeinsam genutzter Ressourcen effektiv lösen und die Korrektheit und Stabilität des Programms sicherstellen.

Frageninhalt

Es gibt einen Testdienst mit 2 Anfragen. Reicht es aus, actualorders 变量形式的共享资源。假设正在运行数百个并行查询,则 actualorders 变量中可能会发生数据冲突。特别是当我循环遍历数组时。为了防止这种情况,使用 mutex für diese Anfragen zu verwenden, wie ich es im Beispiel unten tue?

main.go:

package main

import (
    "encoding/json"
    "errors"
    "fmt"
    "net/http"
    "os"
    "time"
)

type Order struct {
    Room      string    `json:"room"`
    UserEmail string    `json:"email"`
    From      time.Time `json:"from"`
    To        time.Time `json:"to"`
}

var ActualOrders = []Order{}

var mutex sync.Mutex

func getOrders(responseWriter http.ResponseWriter, request *http.Request) {
    userEmail := request.URL.Query().Get("email")

    results := []Order{}

    mutex.Lock()

    for _, item := range ActualOrders {
        if item.UserEmail == userEmail {
            results = append(results, item)
        }
    }

    mutex.Unlock()

    bytes, err := json.Marshal(results)
    if err != nil {
        http.Error(responseWriter, err.Error(), http.StatusInternalServerError)
        return
    }

    responseWriter.Header().Set("Content-type", "application/json")
    responseWriter.WriteHeader(http.StatusOK)
    responseWriter.Write(bytes)
}

func createOrder(responseWriter http.ResponseWriter, request *http.Request) {
    var newOrder Order

    requestBody := request.Body
    defer request.Body.Close()
    err := json.NewDecoder(requestBody).Decode(&newOrder)
    if err != nil {
        http.Error(responseWriter, err.Error(), http.StatusBadRequest)
        return
    }

    mutex.Lock()

    for _, order := range ActualOrders {
        if !(newOrder.To.Before(order.From) || newOrder.From.After(order.To)) {
            http.Error(responseWriter, http.StatusText(http.StatusConflict), http.StatusConflict)
            return
        }
    }

    ActualOrders = append(ActualOrders, newOrder)

    mutex.Unlock()

    responseWriter.WriteHeader(http.StatusCreated)
}

func main() {
    mux := http.NewServeMux()

    mux.HandleFunc("/orders", getOrders)
    mux.HandleFunc("/order", createOrder)

    err := http.ListenAndServe(":8080", mux)
    if errors.Is(err, http.ErrServerClosed) {
        fmt.Printf("server closed\n")
    } else if err != nil {
        fmt.Printf("error starting server: %s\n", err)
        os.Exit(1)
    }
}
Nach dem Login kopieren

Workaround

Die Verwendung eines Mutex, wie Sie es getan haben, verhindert Datenrennen. Ihre Implementierung kann jedoch verbessert werden.

Sie können eine rwmutex,对 getorders 函数使用读锁,对 createorder 函数使用锁。这将允许在写入时对 actualorders-Variable für den exklusiven Zugriff verwenden, aber gemeinsame Lesevorgänge zulassen:

var mutex sync.RWMutex

func getOrders(responseWriter http.ResponseWriter, request *http.Request) {
    ...
    mutex.RLock()
    ... 
    mutex.RUnlock()
}

func createOrder(responseWriter http.ResponseWriter, request *http.Request) {
    ...
    mutex.Lock()
    for _, order := range ActualOrders {
       ... 
    }
    ActualOrders = append(ActualOrders, newOrder)
    mutex.Unlock()

 }
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie können Zugriffskonflikte auf gemeinsam genutzte Ressourcen gelöst werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!