GNU/Linux >> Belajar Linux >  >> Linux

Cara Membuat Thread di Linux (Dengan Program Contoh C)

Di bagian I dari seri Utas Linux, kami membahas berbagai aspek yang terkait dengan utas di Linux.

Pada artikel ini kita akan fokus pada bagaimana sebuah thread dibuat dan diidentifikasi. Kami juga akan menyajikan contoh program C yang akan menjelaskan bagaimana melakukan pemrograman thread dasar.

Linux Threads Series:part 1, part 2 (artikel ini), part 3.

Identifikasi Utas

Sama seperti proses yang diidentifikasi melalui ID proses, utas diidentifikasi oleh ID utas. Tapi yang menarik, kesamaan antara keduanya berakhir di sini.

  • ID proses bersifat unik di seluruh sistem sedangkan ID utas unik hanya dalam konteks satu proses.
  • ID proses adalah nilai integer tetapi ID thread belum tentu merupakan nilai integer. Bisa jadi itu adalah struktur
  • ID proses dapat dicetak dengan sangat mudah sedangkan ID utas tidak mudah dicetak.

Poin di atas memberikan gambaran tentang perbedaan antara ID proses dan ID utas.

ID Thread diwakili oleh tipe 'pthread_t'. Seperti yang telah kita bahas bahwa dalam sebagian besar kasus, tipe ini adalah struktur, jadi harus ada fungsi yang dapat membandingkan dua ID utas.

#include <pthread.h>
int pthread_equal(pthread_t tid1, pthread_t tid2);

Jadi seperti yang Anda lihat bahwa fungsi di atas mengambil dua ID utas dan mengembalikan nilai bukan nol jika kedua ID utas sama atau tidak mengembalikan nol.

Kasus lain mungkin muncul ketika sebuah utas ingin mengetahui ID utasnya sendiri. Untuk kasus ini, fungsi berikut menyediakan layanan yang diinginkan.

#include <pthread.h>
pthread_t pthread_self(void);

Jadi kita melihat bahwa fungsi 'pthread_self()' digunakan oleh sebuah thread untuk mencetak ID threadnya sendiri.

Sekarang, orang akan bertanya tentang kasus di mana dua fungsi di atas diperlukan. Misalkan ada kasus di mana daftar tautan berisi data untuk utas yang berbeda. Setiap node dalam daftar berisi ID utas dan data yang sesuai. Sekarang setiap kali sebuah utas mencoba mengambil datanya dari daftar tertaut, pertama-tama ia mendapatkan ID-nya sendiri dengan memanggil 'pthread_self()' dan kemudian memanggil 'pthread_equal()' pada setiap simpul untuk melihat apakah simpul tersebut berisi data untuknya atau tidak .

Contoh kasus umum yang dibahas di atas adalah kasus di mana utas master mendapatkan pekerjaan untuk diproses dan kemudian mendorongnya ke daftar tautan. Sekarang utas pekerja individu mengurai daftar tertaut dan mengekstrak pekerjaan yang diberikan kepada mereka.

Pembuatan Utas

Biasanya ketika sebuah program dijalankan dan menjadi sebuah proses, itu dimulai dengan utas default. Jadi kita dapat mengatakan bahwa setiap proses memiliki setidaknya satu utas kontrol. Suatu proses dapat membuat utas tambahan menggunakan fungsi berikut:

#include <pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void), void *restrict arg)

Fungsi di atas membutuhkan empat argumen, pertama-tama mari kita bahas sedikit tentangnya :

  • Argumen pertama adalah alamat tipe pthread_t. Setelah fungsi berhasil dipanggil, variabel yang alamatnya diteruskan sebagai argumen pertama akan menyimpan ID utas dari utas yang baru dibuat.
  • Argumen kedua mungkin berisi atribut-atribut tertentu yang kita inginkan untuk memuat utas baru. Bisa jadi prioritas dll.
  • Argumen ketiga adalah penunjuk fungsi. Ini adalah sesuatu yang perlu diingat bahwa setiap utas dimulai dengan suatu fungsi dan alamat fungsi itu diteruskan di sini sebagai argumen ketiga sehingga kernel tahu dari fungsi mana untuk memulai utas.
  • Karena fungsi (yang alamatnya diteruskan dalam argumen ketiga di atas) dapat menerima beberapa argumen juga sehingga kami dapat meneruskan argumen ini dalam bentuk pointer ke tipe void. Sekarang, mengapa tipe void dipilih? Ini karena jika suatu fungsi menerima lebih dari satu argumen maka pointer ini bisa menjadi pointer ke struktur yang mungkin berisi argumen ini.

Contoh Utas Praktis

Berikut adalah contoh kode di mana kami mencoba menggunakan ketiga fungsi yang dibahas di atas.

#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>

pthread_t tid[2];

void* doSomeThing(void *arg)
{
    unsigned long i = 0;
    pthread_t id = pthread_self();

    if(pthread_equal(id,tid[0]))
    {
        printf("\n First thread processing\n");
    }
    else
    {
        printf("\n Second thread processing\n");
    }

    for(i=0; i<(0xFFFFFFFF);i++);

    return NULL;
}

int main(void)
{
    int i = 0;
    int err;

    while(i < 2)
    {
        err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
        if (err != 0)
            printf("\ncan't create thread :[%s]", strerror(err));
        else
            printf("\n Thread created successfully\n");

        i++;
    }

    sleep(5);
    return 0;
}

Jadi apa yang dilakukan kode ini adalah :

  • Ini menggunakan fungsi pthread_create() untuk membuat dua utas
  • Fungsi awal untuk kedua utas tetap sama.
  • Di dalam fungsi 'doSomeThing()', utas menggunakan fungsi pthread_self() dan pthread_equal() untuk mengidentifikasi apakah utas yang dieksekusi adalah yang pertama atau kedua yang dibuat.
  • Selain itu, di dalam fungsi yang sama 'doSomeThing()' for loop dijalankan untuk mensimulasikan beberapa pekerjaan yang memakan waktu.

Sekarang, ketika kode di atas dijalankan, berikut adalah outputnya:

$ ./threads
Thread created successfully
First thread processing
Thread created successfully
Second thread processing

Seperti yang terlihat pada output, utas pertama dibuat dan mulai diproses, kemudian utas kedua dibuat dan kemudian mulai diproses. Nah satu hal yang perlu diperhatikan di sini adalah bahwa urutan pelaksanaan utas tidak selalu tetap. Itu tergantung pada algoritma penjadwalan OS.

Catatan:Seluruh penjelasan dalam artikel ini dilakukan di thread Posix. Seperti yang dapat dipahami dari tipenya, tipe pthread_t adalah singkatan dari POSIX threads. Jika aplikasi ingin menguji apakah thread POSIX didukung atau tidak, maka aplikasi dapat menggunakan makro _POSIX_THREADS untuk pengujian waktu kompilasi. Untuk mengkompilasi kode yang berisi panggilan ke posix API, gunakan opsi kompilasi ‘-pthread’.


Linux
  1. Cara Membuat File Proc Linux di Program C menggunakan LKM

  2. Cara Mengakhiri Thread dalam Program C ( Contoh pthread_exit )

  3. Cara Membuat Sistem File ZFS dengan Kompresi File di Linux

  1. Cara Membuat Pengguna Dengan Direktori Home Kustom Di Linux

  2. Bagaimana cara membuat file dengan ukuran tertentu di Linux?

  3. Bagaimana cara mendapatkan id utas dari pthread di program linux c?

  1. Bagaimana memberi nama utas di Linux?

  2. Bagaimana Anda membuat jendela di Linux dengan C++?

  3. Penanganan sinyal dengan banyak utas di Linux