初認識Linuxスレッド

2086 ワード

Linuxのスレッドも曲がりくねっていて、2.4カーネルのときはスレッドがプロセスを使って実現しています.しかし、2.6コアは何も奇妙なものを見ていません.スレッドはスレッドであり、プロセスはプロセスです.
スレッドはなぜですか?
スレッドの切り替えは、プロセスのコンテキスト、例えばNマルチレジスタ値の保存を切り替える必要はありません.だから軽量級です.速度も速くなりますが、同期など多くの問題も発生します.
Linuxのスレッドを簡単に見てみましょう.
次のプログラムは,マルチスレッド,反発により1つの変数を加算する.

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

#define MAX 100
pthread_mutex_t  mutex; //   
static int count; //       

void err_quit(char *msg)
{
        fprintf(stderr,"%s
",msg); exit(0); } void *th_incre(void *arg) // { int pid; pthread_mutex_lock(&mutex); // pid = (int)arg; printf("%d thread and count=%d
",pid,count); count++; pthread_mutex_unlock(&mutex); // pthread_exit((void *)0); // , return, } int main(int argc, char *argv[]) { pthread_t pid[MAX]; int i,err; void *status[MAX]; long max_thread=sysconf(_SC_THREAD_THREADS_MAX);// ,Linux printf("MAX_THREAD=%ld
",max_thread); pthread_mutex_init(&mutex, NULL);// , PTHREAD_MUTEX_INITIALIZER for(i = 0; i < MAX; i++){ err = pthread_create(&pid[i],NULL,th_incre,(void *)i); // 。 if(err != 0) err_quit("create thread error"); pthread_join(pid[i],&status[i]);// , 。 redhat5.5 } pthread_mutex_destroy(&mutex);// , exit(0); }

単純なマルチスレッドプログラムです.反発量同期を用いた.もちろん、スレッドには複雑なものがたくさんあります.後で話しましょう.
ところで、ここでは、接続時に-lpthreadオプションを使用して、スレッドライブラリをロードします.
$gcc -g -Wall -lpthread -o count th_count.o