初認識Linuxスレッド
2086 ワード
Linuxのスレッドも曲がりくねっていて、2.4カーネルのときはスレッドがプロセスを使って実現しています.しかし、2.6コアは何も奇妙なものを見ていません.スレッドはスレッドであり、プロセスはプロセスです.
スレッドはなぜですか?
スレッドの切り替えは、プロセスのコンテキスト、例えばNマルチレジスタ値の保存を切り替える必要はありません.だから軽量級です.速度も速くなりますが、同期など多くの問題も発生します.
Linuxのスレッドを簡単に見てみましょう.
次のプログラムは,マルチスレッド,反発により1つの変数を加算する.
単純なマルチスレッドプログラムです.反発量同期を用いた.もちろん、スレッドには複雑なものがたくさんあります.後で話しましょう.
ところで、ここでは、接続時に-lpthreadオプションを使用して、スレッドライブラリをロードします.
スレッドはなぜですか?
スレッドの切り替えは、プロセスのコンテキスト、例えば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