0Pricing
C Academy · レッスン

同期と競合状態

共有リソースを安全に管理するため、ミューテックスとセマフォを実装します

「同期と競合状態」はCoddyKit上の無料C Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全3レッスンが含まれています。

同期と競合状態

同期と競合状態

複数のスレッドが共有リソースにアクセスすると、競合状態が発生し、予測できない結果につながることがあります。

このレッスンでは、次のことを学びます。

  • 競合状態とは何か、またどのように発生するか。
  • 競合状態を防ぐためにミューテックスを使用する方法。
  • 共有リソースの管理にセマフォを役立てる方法。
同期と競合状態 — イラスト1

競合状態とは

競合状態とは

複数のスレッドが共有データに同時にアクセスすると、競合状態が発生し、予測できない動作につながります。

例:

  • 2つのスレッドがグローバルカウンターを更新しようとします。
  • 相互干渉により、最終的な値が正しくならない可能性があります。

例:マルチスレッドにおける競合状態

例:マルチスレッドにおける競合状態

このプログラムでは、複数のスレッドが共有変数を変更することで競合状態が発生する例を示します。

#include <stdio.h>
#include <pthread.h>

int counter = 0;

void *incrementCounter(void *arg) {
    for (int i = 0; i < 1000000; i++) {
        counter++;
    }
    return NULL;
}

int main() {
    pthread_t t1, t2;
    pthread_create(&t1, NULL, incrementCounter, NULL);
    pthread_create(&t2, NULL, incrementCounter, NULL);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    printf("Final counter value: %d\n", counter);
    return 0;
}

ミューテックスによる競合状態の防止

ミューテックスによる競合状態の防止

ミューテックス(相互排他)を使用すると、一度に1つのスレッドだけがリソースにアクセスできるようになります。

ミューテックスの関数:

  • pthread_mutex_init() - ミューテックスを初期化します。
  • pthread_mutex_lock() - ミューテックスをロックします。
  • pthread_mutex_unlock() - ミューテックスのロックを解除します。
  • pthread_mutex_destroy() - ミューテックスを破棄します。

例:ミューテックスによる競合状態の防止

例:ミューテックスによる競合状態の防止

このプログラムでは、ミューテックスを使用して共有カウンターへのアクセスを制御し、競合状態を解消します。

#include <stdio.h>
#include <pthread.h>

int counter = 0;
pthread_mutex_t lock;

void *incrementCounter(void *arg) {
    for (int i = 0; i < 1000000; i++) {
        pthread_mutex_lock(&lock);
        counter++;
        pthread_mutex_unlock(&lock);
    }
    return NULL;
}

int main() {
    pthread_t t1, t2;
    pthread_mutex_init(&lock, NULL);
    pthread_create(&t1, NULL, incrementCounter, NULL);
    pthread_create(&t2, NULL, incrementCounter, NULL);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_mutex_destroy(&lock);
    printf("Final counter value: %d\n", counter);
    return 0;
}

セマフォとは

セマフォとは

セマフォは、リソースへのアクセスを制御するために使用するカウンターです。

主な関数:

  • sem_init() - セマフォを初期化します。
  • sem_wait() - セマフォの値を減らします。
  • sem_post() - セマフォの値を増やします。
  • sem_destroy() - セマフォを破棄します。

例:セマフォによる同期

例:セマフォによる同期

このプログラムでは、セマフォを使用して共有リソースへのアクセスを管理します。

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>

sem_t sem;

void *task(void *arg) {
    sem_wait(&sem);
    printf("Thread %d is executing\n", *(int *)arg);
    sem_post(&sem);
    return NULL;
}

int main() {
    pthread_t t1, t2;
    int id1 = 1, id2 = 2;
    sem_init(&sem, 0, 1);
    pthread_create(&t1, NULL, task, &id1);
    pthread_create(&t2, NULL, task, &id2);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    sem_destroy(&sem);
    return 0;
}

スレッド同期のベストプラクティス

スレッド同期のベストプラクティス

競合状態を避けるには、次の点に注意します。

  • 共有変数を保護するためにミューテックスを使用します。
  • リソースを管理するためにセマフォを使用します。
  • 可能な限り、共有リソースの使用を最小限に抑えます。

まとめ

まとめ

このレッスンでは、次のことを学びました。

  • 競合状態とは何か、またどのように発生するか。
  • 競合状態を防ぐためにミューテックスを使用する方法。
  • 共有リソースへのアクセスの管理にセマフォを役立てる方法。

これで、Cの「マルチスレッドと並行性」セクションは終了です。

同期と競合状態 — イラスト10

よくある質問

「同期と競合状態」レッスンは無料ですか?

はい。「同期と競合状態」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全3レッスンが含まれています。

「同期と競合状態」で何を学びますか?

共有リソースを安全に管理するため、ミューテックスとセマフォを実装します ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。

「同期と競合状態」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC Academyレッスンでコードを書いて実行できますか?

はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. スレッドの概要
  2. スレッドの作成と管理
  3. 同期と競合状態
← C Academyに戻る