マルチスレッドの基礎


Cはデフォルトで1つのスレッドで動作する言語です.これは、コードが一度に1つの命令だけを実行することを意味します.場合によっては、複数の命令を一度に行う必要があるでしょう.例えば、グラフィカルインターフェイスは、ボタンのクリックに関連するアクションを実行するときに停止しません.これはマルチスレッドを呼び出すものであり、複数のタスクを行う1つのスレッドで実行できる非同期操作と混同されない.

スレッドとは
スレッドはプロセスにリンクされるタスクです.我々が複数の糸と糸を持つことができるプロセスは、他のスレッドを走らせることができます.
デフォルトでは、プロセスは単一のスレッドで実行されます.各スレッドは、他のスレッドと無期限に並列に実行できる新しいタスクです.

スレッドの作成
タイトルで言うように、このポストはCのマルチスレッドについて話します、それで、我々はCをします!
POSIXオペレーティングシステムでは、pthread.h , どれが正確に言うか、糸を作成する!コンパイラの下で使用するには、-lpthread 引数gcc -lpthread main.c ).
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>

void
wait(void)
{
    sleep(2);

    printf("Done.\n");
}

int
main(void)
{
    pthread_t thread;
    int err;

    err = pthread_create(&thread, NULL, wait, NULL);

    if (err)
    {
        printf("An error occured: %d", err);
        return 1;
    }

    printf("Waiting for the thread to end...\n");

    pthread_join(thread, NULL);

    printf("Thread ended.\n");    

    return 0;
}
出力は次のようになります.
Waiting for the thread to end...
Done. (~2 seconds after)
Thread ended.
作成されたスレッドが動作している間にメインスレッドが継続してメッセージを出力し、新しいスレッドで関数を呼び出す行は1行だけです.たぶん、あなたは少し失われている、私はコードを説明します.
まず第一に、我々はpthread.h ライブラリは、前述のように、マルチスレッドタスクを実行するために必要なすべての機能を含んでいます.それから我々はunistd.h にはsleep() 関数.それからstdio.h for printf() .pthread_create 関数を呼び出してスレッドを作成します.これはpthread_t , はスレッドディスクリプタであり、void 関数と他のパラメータについて説明します.pthread_join は現在のスレッドプロセスを他のスレッドにリンクするために使われる.それは文字通りプログラムが選択された糸の終わりを待つために停止するようにします.

ミューテックス
つのターゲットに同時に複数の操作を行うことは非常に危険です.つのスレッドが同時に一つのファイルを書きたいなら、ハードドライブがCPUと同じくらい速く行くことができないので、それは問題でしょう.この場合、ファイルを破損することができるタスクでハードドライブをオーバーロードしないように、他のスレッドをロックする必要があります.mutexを使用して他のスレッドをロックできます.
実際には、mutexを使ってタスクがロックされているかロックされていないかを指示します.
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>

pthread_mutex_t lock;
int j;

void
do_process()
{
    pthread_mutex_lock(&lock);
    int i = 0;

    j++;

    while(i < 5)
    {
        printf("%d", j);
        sleep(1);

        i++;
    }

    printf("...Done\n");

    pthread_mutex_unlock(&lock);
}

int
main(void)
{
    int err;
    pthread_t t1, t2;

    if (pthread_mutex_init(&lock, NULL) != 0)
    {
        printf("Mutex initialization failed.\n");
        return 1;
    }

    j = 0;

    pthread_create(&t1, NULL, do_process, NULL);
    pthread_create(&t2, NULL, do_process, NULL);

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    return 0;
}
出力は次のようになります.
111111...Done
222222...Done
それで、あなたが見ることができるように、糸t2 完全に後t1 , それで、mutexは働きました!それは結果ではないpthread_join 現在のスレッド(ここではメインスレッド)に対して何かを変更するだけで、T 1以前にT 2に参加することができます.

セマフォ
mutexとほぼ同じもので、セマフォはどんなスレッドでも制御されます.所有権の概念はセマフォの場合には存在しないので、プログラムのどの部分によってロックされてもロックを解除できない.
それはかなり簡単だったと思いませんか?C関数は、そのような行動を実行するのに非常に強力です.