ホームページ >バックエンド開発 >Golang >go - cgo を使用すると、`__GI___pthread_mutex_unlock` が実行時間のほとんどを消費します

go - cgo を使用すると、`__GI___pthread_mutex_unlock` が実行時間のほとんどを消費します

WBOY
WBOY転載
2024-02-10 09:45:08489ブラウズ

go - 使用 cgo 时,`__GI___pthread_mutex_unlock` 占用大部分执行时间

php エディター Zimo は、cgo を使用すると時々問題が発生することを発見しました。つまり、`__GI___pthread_mutex_unlock` が実行時間のほとんどを消費するということです。この問題はパフォーマンスの低下を引き起こし、プログラムの実行効率に影響を与える可能性があります。この問題を解決するには、__GI___pthread_mutex_unlock の機能と原理を深く理解し、対応する最適化方法を見つける必要があります。この記事では、読者がこの問題をよりよく理解し、解決できるように、この問題の詳細な分析を提供します。

質問内容

cgoを使用してgoからc関数を呼び出しています。 c 関数内には go 関数へのコールバックがあります。つまり、 go -> c -> go と呼びます。

pprof を実行した後、__gi___pthread_mutex_unlock が実行時間の半分を占めていることに気付きました。私の知る限り、cgo にはオーバーヘッド、特に c から go へのコールバックがあります。しかし不思議なことに、cgo は実行時間の半分をロックに費やします。私のコードに何か問題がありますか?

main.go

65bcae965051

callback.go

65bcae965088

実行環境:

lscpu

65bcae965093

Go言語バージョン

65bcae9650aa

これは pprof の結果です:

編集: 実行環境を追加

回避策

上記のプログラムでは再現できませんが:

65bceaa20ecf

ただし、コールバックごとに グローバル ミューテックス が存在するため、並列コールバックを実行するとパフォーマンスが低下します。

以上がgo - cgo を使用すると、`__GI___pthread_mutex_unlock` が実行時間のほとんどを消費しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。