C は強力なプログラミング言語であり、マルチスレッド アプリケーションを開発するための重要な言語の 1 つです。最近では、マルチスレッドプログラミングを面接の重要な検査ポイントとして捉える企業が増えています。この記事では、C マルチスレッドの面接でよくある質問を要約し、回答します。
スレッドとは、コンピュータがプログラムを並行して実行するときの最小単位を指します。プロセスは複数のスレッドを持つことができ、プロセスは実行中のアプリケーション インスタンスです。スレッドはプロセス内のデータとリソースを共有できます。これは軽量の同時実行方式です。プロセスと比較して、スレッドは作成、キャンセル、切り替えが速く、占有するシステム リソースも少なくなります。
プロセスとスレッドの主な違いは、前者は独立したアドレス空間とシステム リソースを持ち、後者はこれらのリソースを共有することです。プロセス内に複数のスレッドを作成すると、各スレッドが互いに連携して、より効率的な同時タスク処理を実現できます。
C では、std::thread クラスを使用して新しいスレッドを作成できます。具体的な方法は、関数を定義し、std::thread を使用してスレッドを作成することです。例:
void task1(){ // do something… } int main(){ std::thread t1(task1); // 创建一个新线程 t1.join(); // 等待线程执行结束 return 0; }
新しいスレッドを作成するときは、異なるスレッド間で共有されるデータとリソースに注意を払う必要があり、スレッド間の相互排他と同期を正しく管理する必要があります。
スレッド セーフティとは、マルチスレッド プログラムの各スレッドでの共有データへのアクセスと変更の正確性を保証することを指します。スレッドの安全性は、ロック、アトミック操作の使用、および共有データの回避によって実現できます。
C には、スレッドセーフでマルチスレッド プログラムで直接使用できる標準ライブラリ関数とデータ構造が多数あります。同時に、作成するコードがスレッドセーフであることを保証するために、ミューテックス ロックや条件変数などのメカニズムの使用にも注意する必要があります。
デッドロックとは、2 つ以上のスレッドが互いのリソースを待機しており、プログラムの実行を続行できなくなる状況を指します。一般的なデッドロックのシナリオは、2 つのスレッドが互いに占有しているロックを取得しようとし、互いが実行できなくなるというものです。
デッドロックを回避するには、共有リソースにアクセスするときに正しいロック シーケンスが使用され、すべてのスレッドが同じ順序でロックを取得するようにする必要があります。同時に、タイムアウト メカニズムを使用して、相手が占有するリソースを待機するときに現在のロックを積極的に放棄してデッドロックを回避できます。
ミューテックス ロックは、マルチスレッド環境で共有データを保護するための一般的なメカニズムです。これは、1 つのスレッドが共有データを占有している場合、他のスレッドはデータにアクセスする前にミューテックス ロックが解放されるまで待つ必要があるというメカニズムを実装しています。
C では、std::mutex クラスを使用してミューテックス ロックを実装できます。例:
#include <mutex> #include <thread> #include <iostream> std::mutex mtx; // 定义一个互斥锁 void task1(){ std::lock_guard<std::mutex> lock(mtx); // 定义一个锁,保护共享数据 // do something… } int main(){ std::thread t1(task1); t1.join(); return 0; }
ミューテックスを使用する場合、デッドロックやパフォーマンスのボトルネックを避けるために、さまざまなスレッドのアクセス順序とロックの粒度に注意する必要があります。
上記は、C マルチスレッドの面接でよくある質問の概要と回答です。実際の面接では、技術的な質問に加えて、優れたチームワーク精神、問題解決のアイデアや能力も示す必要があります。この記事が C マルチスレッド面接の準備に役立つことを願っています。
以上がC++ でのマルチスレッド面接に関する FAQの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。