2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
थ्रेड् : प्रक्रियायां एकः सत्ता तथा च CPU समयनिर्धारणस्य प्रेषणस्य च मूलभूतं एककं । सूत्रस्य एव मूलतः प्रणालीसंसाधनानाम् स्वामित्वं नास्ति, केवलं कतिपयानि संसाधनानि सन्ति ये चालनार्थं अत्यावश्यकाः सन्ति (यथा प्रोग्रामगणकः, रजिस्टर्-समूहः, स्तम्भः च), परन्तु सः प्रक्रियायाः स्वामित्वं प्राप्तान् सर्वान् संसाधनान् अन्यैः थ्रेड्-सहितं साझां कर्तुं शक्नोति ये समानप्रक्रियायाः सन्ति। एकः सूत्रः अन्यं सूत्रं निर्मातुम्, नाशयितुं च शक्नोति, एकस्मिन् एव प्रक्रियायां बहुविधं सूत्रं युगपत् निष्पादयितुं शक्नोति; धागाः कार्यकाले व्यत्यस्तव्यवहारं दर्शयन्ति । (उपरोक्तं "कम्प्यूटर लेवल ४ ट्युटोरियल् - ऑपरेटिंग् सिस्टम् सिद्धान्ताः" इत्यस्मात् अस्ति)
यदा थ्रेड्स इत्यस्य विषयः आगच्छति तदा प्रक्रियायाः परिभाषायाः विषये वक्तुं आवश्यकम् अस्ति : प्रक्रिया एकः कार्यक्रमः अस्ति यस्य कतिपयानि स्वतन्त्राणि कार्याणि सन्ति प्रक्रिया प्रणाल्यां संसाधनविनियोगाय, समयनिर्धारणाय च स्वतन्त्रः एककः भवति (उपरोक्तं "कम्प्यूटर लेवल 4 ट्युटोरियल् - ऑपरेटिंग् सिस्टम् सिद्धान्ताः" इत्यस्मात् अस्ति)
प्रक्रियायाः परिभाषा किञ्चित् जटिला भवति पश्यामः यत् प्रक्रियायां किं भवति: कार्यक्रमः, आँकडा, प्रक्रियानियन्त्रणखण्डः च । तेषु कार्यक्रमः प्रक्रियापरिभाषायां "कतिपयस्वतन्त्रकार्ययुक्तस्य कार्यक्रमस्य" अनुरूपः भवति तथापि कार्यक्रमस्य एव अतिरिक्तं प्रक्रियायाः दत्तांशस्य (यत् संसाधनरूपेण अवगन्तुं शक्यते) प्रक्रियानियन्त्रणखण्डानां च आवश्यकता भवति यदा कश्चन कार्यक्रमः चालितः भवति तदा कार्यक्रमः एतेषु संसाधनेषु अवलम्बते, यत् वयं "प्रक्रिया" इति वदामः ।
प्रक्रियाणां मूलभूतगुणद्वयम् : १.
प्रक्रिया एकः स्वतन्त्रः एककः अस्ति यः संसाधनानाम् स्वामित्वं कर्तुं शक्नोति;
प्रक्रिया एकः मूलभूतः एककः अस्ति यस्य समयनिर्धारणं प्रेषणं च कर्तुं शक्यते ।
यदा प्रथमवारं सूत्राणि स्थापितानि आसन् तदा प्रक्रियायाः उपर्युक्तौ विशेषताद्वयं पृथक् कर्तुं आसीत् धागाः "CPU समयनिर्धारणस्य प्रेषणस्य च मूलभूतं एककं" भवन्ति and dispatch threads to better इदं प्रक्रियाणां समानान्तरनिष्पादनं साक्षात्कर्तुं शक्नोति एकस्मिन् समये, एकस्यामेव प्रक्रियायाः अन्तर्गतं धागाः प्रक्रियायाः सर्वाणि संसाधनानि साझां कर्तुं शक्नुवन्ति, ये एकस्यामेव प्रक्रियायाः अन्तर्गतं भिन्न-भिन्न-सूत्रैः प्रक्रिया-संसाधनानाम् अभिगमनं तृप्तुं शक्नुवन्ति सूत्राणां उद्भवः चतुराईपूर्वकं प्रक्रियायाः गुणद्वयं पृथक् करोति, येन प्रक्रिया समानान्तरनिष्पादनस्य आवश्यकताः उत्तमरीत्या सम्पादयितुं शक्नोति
सूत्रं चालितं कार्यं भवति । POSIX थ्रेड् मानकानां समुच्चयः अस्ति, न तु कार्यान्वयनस्य समुच्चयः । अन्ये मानकानि सन्ति यथा: openmp threads ।
Thread identifier: pthread_t (अहं विशिष्टां सामग्रीं न जानामि, प्रत्येकं कम्पनी भिन्नरूपेण कार्यान्वितं करोति, Linux इत्यस्य अन्तर्गतं int अस्ति)
px axm आदेशः प्रक्रियाः थ्रेड् च पश्यति - प्रक्रियायाः अन्तर्गतं थ्रेड् प्रतिनिधित्वं करोति । px ax -L लघुसूत्राणि द्रष्टुं ।
int pthread_equal (pthread_t t1, pthread_t t2); यदि ते समानाः सन्ति तर्हि अशून्यं प्रत्यागच्छति यदि ते भिन्नाः सन्ति तर्हि 0 प्रत्यागच्छति ।
pthread_t pthread_self (void);
int pthread_create (pthread_t * धागा, const pthread_attr_t * attr,
शून्य * (* आरंभ_रूटीन) (शून्य *), शून्य * आर्ग);
थ्रेड् शेड्यूलिंग् शेड्यूलरस्य रणनीत्याः उपरि निर्भरं भवति ।
- #include <stdlib.h>
- #include <stdio.h>
- #include <pthread.h>
- #include <string.h>
-
- void* myfunc(void *p)
- {
- puts("Thread is run!");
-
- printf("thread %ld n",pthread_self());
- return NULL;
- }
-
- int main()
- {
- puts("Begin!");
- pthread_t tid;
- int ret;
- ret = pthread_create(&tid,NULL,myfunc ,NULL);
- if(ret)
- {
- fprintf(stderr,"%s n",strerror(ret));
- exit(1);
- }
- printf("main %ld n",pthread_self());
-
-
-
- puts("End!");
- }
1. थ्रेड् स्टार्टअप रूटीनतः प्रत्यागच्छति, रिटर्न् मूल्यं च थ्रेड् इत्यस्य निर्गमनसङ्केतः भवति ।
2. अस्मिन् एव प्रक्रियायां अन्यैः सूत्रैः सूत्राणि रद्दं कर्तुं शक्यन्ते ।
3. थ्रेड् pthread_exit() फंक्शन् आह्वयति । शून्य pthread_exit (शून्य * retval);
int pthread_join(pthread_t thread, void **retval);
- #include <stdlib.h>
- #include <stdio.h>
- #include <pthread.h>
- #include <string.h>
-
- void* myfunc(void *p)
- {
- puts("Thread is run!");
-
- pthread_exit(NULL);//线程专用清理函数。
- // return NULL;
- }
-
-
- int main()
- {
- puts("Begin!");
- pthread_t tid;
- int ret;
- ret = pthread_create(&tid,NULL,myfunc ,NULL);
- if(ret)
- {
- fprintf(stderr,"%s n",strerror(ret));
- exit(1);
- }
- pthread_join(tid,NULL); //收尸
-
- puts("End!");
- }
pthread_cleanup_push (); //atexit के बराबर
pthread_cleanup_pop(); //सक्रियरूपेण आँकडानां आनयनस्य बराबरम्।
void pthread_cleanup_push (void (* routine)(void *), पूर्वसंसाधनं द्रष्टुं मैक्रो, gcc -E इत्यस्य कार्यान्वयनम् अस्ति
शून्य * आर्ग);
void pthread_cleanup_pop (int निष्पादित करें);युग्मरूपेण अवश्यं दृश्यते, मैक्रोभिः सह कार्यान्वितम्
- #include <stdlib.h>
- #include <stdio.h>
- #include <pthread.h>
- #include <string.h>
-
-
- void cleanup_fun(void*p)
- {
- puts(p);
- }
-
- void* myfunc(void *p)
- {
- puts("Thread is run!");
-
- pthread_cleanup_push(cleanup_fun,"cleanup:1");
- pthread_cleanup_push(cleanup_fun,"cleanup:2");
- pthread_cleanup_push(cleanup_fun,"cleanup:3");
-
- puts("push over!");
-
-
-
- pthread_exit(NULL);//线程专用清理函数。
- // return NULL;
- pthread_cleanup_pop(1) //线程退出后,全部都会调用;
- pthread_cleanup_pop(0);
- pthread_cleanup_pop(1);
- }
-
-
- int main()
- {
- puts("Begin!");
- pthread_t tid;
- int ret;
- ret = pthread_create(&tid,NULL,myfunc ,NULL);
- if(ret)
- {
- fprintf(stderr,"%s n",strerror(ret));
- exit(1);
- }
- pthread_join(tid,NULL); //收尸
-
- puts("End!");
- }
यदि चालितः सूत्रः शवस्य संग्रहणं कर्तुम् इच्छति तर्हि प्रथमं रद्दं (pthread_cancel) ततः शवस्य संग्रहणं (pthread_join) करणीयम् ।
थ्रेड रद्दीकरण: int pthread_cancel (pthread_t थ्रेड);
रद्दीकरणस्य द्वौ स्थितिौ स्तः : अनुमतं न अनुमतम् इति ।
रद्दीकरणस्य अनुमतिः नास्ति: कोडनिष्पादनं अप्रभावितं निरन्तरं भवति।
अनुमतं रद्दीकरणं यथा विभक्तं भवति: अतुल्यकालिकं रद्दीकरणं, तथा च विलम्बितं रद्दीकरणं (पूर्वनिर्धारितं) -> रद्दीकरणबिन्दुपर्यन्तं विलम्बितप्रतिसादः ।
Cancal point: Posix द्वारा परिभाषिताः cancel बिन्दुः सिस्टम् आह्वानं भवति यत् जामस्य कारणं भवितुम् अर्हति ।
pthread_setcancelstate: रद्दीकरणस्थितिः सेट् कर्तुं शक्यते।
pthread_setcanceltype: भवान् रद्दीकरणविधिं सेट् कर्तुं शक्नोति।
pthread_testcancel: फंक्शन् किमपि न करोति, केवलं बिन्दुं रद्दं करोति ।
धागा विच्छेद: int pthread_detach (pthread_t धागा);
गतिशील मॉड्यूल एकल आरंभीकरण फ़ंक्शन: int pthread_once (pthread_once_t * एक बार_नियंत्रण,
शून्य (* आरंभ_दिनचर्या) (शून्य));
pthread_once_t एक बार_नियंत्रण = PTHREAD_एकदा_INIT;
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <pthread.h>
- #define LEFT 30000000
- #define RIGHT 30000200
- #define THRNUM (RIGHT-LEFT+1)
-
- void* thr_prime(void*p);
-
- int main()
- {
- pthread_t tid[THRNUM];
- int i,j,mark;
- int err;
- for(i =LEFT;i<=RIGHT;i++)
- {
- err= pthread_create(tid+(i-LEFT),NULL,thr_prime,&i);
- if(err)
- {
- fprintf(stderr,"pthread_create():%sn",strerror(err));
- }
- }
-
- for(i=LEFT;i<=RIGHT;i++)
- {
- pthread_join(tid[i-LEFT],NULL);
- }
-
- return 0;
- }
-
- void* thr_prime(void*p)
- {
- int i,j,mark;
-
- i = *(int*)p;
-
- mark = 1;
- for(j=2;j<i/2;j++)
- {
- if(i%j ==0)
- {
- mark = 0;
- break;
- }
- }
- if(mark)
- printf("%d is a primer n",i);
- pthread_exit(NULL);
- return NULL;
- }
उपर्युक्तसङ्केतस्य चालने स्पर्धा भविष्यति । यतः मापदण्डाः पताद्वारा पारिताः भवन्ति, तस्मात् दत्तांशं * द्वारा पुनः प्राप्तुं आवश्यकं भवति, पूर्वसूत्रेण कार्यं कृतम् अस्ति वा इति गारण्टी नास्ति सरलतमः विधिः मूल्यपारीकरणस्य उपयोगः
प्राइमर०.ग
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <pthread.h>
- #define LEFT 30000000
- #define RIGHT 30000200
- #define THRNUM (RIGHT-LEFT+1)
-
- void* thr_prime(void*p);
-
- int main()
- {
- pthread_t tid[THRNUM];
- int i,j,mark;
- int err;
- for(i =LEFT;i<=RIGHT;i++)
- {
- err= pthread_create(tid+(i-LEFT),NULL,thr_prime,(void *)i);
- // err= pthread_create(tid+(i-LEFT),NULL,thr_prime,&i);
- if(err)
- {
- fprintf(stderr,"pthread_create():%sn",strerror(err));
- }
- }
-
- for(i=LEFT;i<=RIGHT;i++)
- {
- pthread_join(tid[i-LEFT],NULL);
- }
-
- return 0;
- }
-
- void* thr_prime(void*p)
- {
- int i,j,mark;
-
- i = (int)p;
- // i = *(int*)p;
-
- mark = 1;
- for(j=2;j<i/2;j++)
- {
- if(i%j ==0)
- {
- mark = 0;
- break;
- }
- }
- if(mark)
- printf("%d is a primer n",i);
- pthread_exit(NULL);
- return NULL;
- }
प्राइमर०_ई.सी
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <pthread.h>
-
- #define LEFT 30000000
- #define RIGHT 30000200
- #define THRNUM (RIGHT-LEFT+1)
-
- struct thr_arg_st
- {
- int n;
- };
-
- void* thr_prime(void*p);
-
- int main()
- {
- pthread_t tid[THRNUM];
- int i,j,mark;
- int err;
- struct thr_arg_st* p;
- void *ptr;
- for(i =LEFT;i<=RIGHT;i++)
- {
- p = malloc(sizeof(*p));
- if(p ==NULL)
- {
- perror("malloc");
- exit(1);
- }
- p->n = i;
- err= pthread_create(tid+(i-LEFT),NULL,thr_prime,p); // p就是结构体指针就是n的地址
- // err= pthread_create(tid+(i-LEFT),NULL,thr_prime,&i);
- if(err)
- {
- fprintf(stderr,"pthread_create():%sn",strerror(err));
- }
- //free 不能在这里free,必须取走数据在free
- }
-
- for(i=LEFT;i<=RIGHT;i++)
- {
- pthread_join(tid[i-LEFT],&ptr);// 收尸并且接受返回参数。
- free(ptr);
-
- }
-
- return 0;
- }
-
- void* thr_prime(void*p)
- {
- int i,j,mark;
-
- i = ((struct thr_arg_st*)p)->n;
-
- mark = 1;
- for(j=2;j<i/2;j++)
- {
- if(i%j ==0)
- {
- mark = 0;
- break;
- }
- }
- if(mark)
- printf("%d is a primer n",i);
- pthread_exit(p); //返回值返回p
- return NULL;
- }
add.c
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <pthread.h>
-
- #define FILENAME "/tmp/out"
- #define THRNUM (20)
-
- void* thr_add(void*p);
-
- int main()
- {
- pthread_t tid[THRNUM];
- int i,j,mark;
- int err;
- for(i =0;i<=THRNUM;i++)
- {
- err= pthread_create(tid+(i),NULL,thr_add,NULL);
- if(err)
- {
- fprintf(stderr,"pthread_create():%sn",strerror(err));
- }
- }
-
- for(i=0;i<=THRNUM;i++)
- {
- pthread_join(tid[i],NULL);
- }
-
- return 0;
- }
-
- void* thr_add(void*p)
- {
- FILE*fp;
- char line_buf[1024];
- int len_size = 1024;
- fp = fopen(FILENAME,"r+");
-
- fgets(line_buf,len_size,fp);
-
- fseek(fp,0,SEEK_SET);
-
- fprintf(fp,"%d n",atoi(line_buf)+1);
-
- fclose(fp);
-
- pthread_exit(NULL);
-
- return NULL;
- }
यदा विंशतिः सूत्राः एकस्मिन् समये सञ्चिकायां दत्तांशं पठन्ति लिखन्ति च तदा स्पर्धा, विग्रहाः च भवितुम् अर्हन्ति । एकः सूत्रः लेखितुं पूर्वं अन्यः सूत्रः अन्तिमदत्तांशं पठति ।
- #include <stdlib.h>
- #include <stdio.h>
- #include <error.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <errno.h>
- #include <signal.h>
- #include <pthread.h>
-
- #include "mytbf.h"
-
- struct mytbf_st
- {
- int cps;
- int burst;
- int token;
- int pos;
- pthread_mutex_t mut;
- };
- static pthread_mutex_t mut_job = PTHREAD_MUTEX_INITIALIZER;
- static pthread_t tid_alrm;
- pthread_once_t init_once = PTHREAD_ONCE_INIT;
-
- static struct mytbf_st* job[MYTBF_MAX];
-
- typedef void (*sighandler_t)(int);
-
-
- static int get_free_pos_unlocked(void)
- {
- for(int i=0;i< MYTBF_MAX;i++)
- {
- if(job[i]==NULL)
- return i;
- }
- return -1;
- }
-
- static void* thr_alrm(void*p)
- {
- while(1)
- {
- pthread_mutex_lock(&mut_job);
- for(int i=0;i<MYTBF_MAX;i++)
- {
- if(job[i] != NULL)
- {
- pthread_mutex_lock(&job[i]->mut);
- job[i]->token += job[i]->cps;
- if(job[i]->token >job[i]->burst )
- {
- job[i]->token = job[i]->burst;
- }
- pthread_mutex_unlock(&job[i]->mut);
- }
- }
- pthread_mutex_unlock(&mut_job);
- sleep(1);
- }
- return NULL;
- }
-
- static void module_unload()
- {
- pthread_cancel(tid_alrm);
- pthread_join(tid_alrm,NULL);
- //只能一个人掉,二个人调用容易出差
- for(int i=0;i<MYTBF_MAX;i++)
- {
- if(job[i]!=NULL)
- {
- mytbf_destroy(job[i]);
- }
- }
- pthread_mutex_destroy(&mut_job);
-
- }
-
- static void module_load()
- {
- int err;
- err = pthread_create(&tid_alrm,NULL,thr_alrm,NULL);
- if(err)
- {
- fprintf(stderr,"create errorn");
- exit(1);
- }
- atexit(module_unload);
- }
-
- mytbf_t* mytbf_init(int cps ,int burst) //C语言中,void*可以赋值给任何类型的指针,任何类型的指针也都可以赋值给void*
- {
- struct mytbf_st*me;
- int pos;
- pthread_once(&init_once,module_load); //只初始化一次
- me = malloc(sizeof(*me));
- if(me == NULL)
- return NULL;
-
- me->cps = cps;
- me->burst = burst;
- me->token = 0;
-
- pthread_mutex_init(&me->mut,NULL);
-
- pthread_mutex_lock(&mut_job);
-
- pos = get_free_pos_unlocked();
- if(pos < 0)
- {
-
- pthread_mutex_unlock(&mut_job);
- free(me);
- return NULL;
- }
- me->pos = pos;
- job[pos] = me;
-
- pthread_mutex_unlock(&mut_job);
-
- return me;
-
- }
- int mytbf_fetchtoken(mytbf_t*ptr,int size) //获取token
- {
- if(size <= 0)
- return -EINVAL; //参数非法
- struct mytbf_st*me = ptr;
- pthread_mutex_lock(&me->mut);
- while(me->token <= 0 ) //token为空就等待
- {
- pthread_mutex_unlock(&me->mut);
- sched_yield();
- pthread_mutex_lock(&me->mut);
- }
-
- int n = (me->token>size?size:me->token);
- me->token -= n;
- pthread_mutex_unlock(&me->mut);
- return n;
- }
-
- int mytbf_returntoken(mytbf_t*ptr,int size) //返还token
- {
- if(size<=0)
- return -EINVAL;
- struct mytbf_st*me = ptr;
-
- pthread_mutex_lock(&me->mut);
-
- me->token+= size;
- if(me->token > me->burst)
- me->token = me->burst;
-
- pthread_mutex_unlock(&me->mut);
- return size;
- }
-
- int mytbf_destroy(mytbf_t*ptr)
- {
- struct mytbf_st *me;
- me = ptr;
- pthread_mutex_lock(&mut_job);
- job[me->pos] = NULL;
- pthread_mutex_unlock(&mut_job);
- pthread_mutex_destroy(&me->mut);
- free(ptr);
- return 0;
-
- }
इदं तालस्य तुल्यम् अस्ति, तस्य संचालनात् पूर्वं तत् अनलॉक् करणीयम् । (प्रश्नविधिः) २.
यदि man pthread_mutex_init त्रुटिं निवेदयति तर्हि कृपया आश्रयाणि संस्थापयन्तु:
sudo apt-get install manpages-posix manpages-posix-dev
int pthread_mutex_destroy (pthread_mutex_t * म्यूटेक्स);
int pthread_mutex_init (pthread_mutex_t * म्यूटेक्स प्रतिबन्धित,
const pthread_mutexattr_t * गतिशील आरंभीकरण प्रतिबन्धित करें;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER स्थिर आरंभीकरण;
int pthread_mutex_lock (pthread_mutex_t * म्यूटेक्स); //加锁
int pthread_mutex_trylock (pthread_mutex_t *mutex);//लॉक कर्तुं प्रयतस्व, यदि न, निष्पादनं निरन्तरं कुर्वन्तु
int pthread_mutex_unlock (pthread_mutex_t * म्यूटेक्स);//解锁
add.c
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <pthread.h>
-
- #define FILENAME "/tmp/out"
- #define THRNUM (20)
-
- pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
-
- void* thr_add(void*p);
-
- int main()
- {
- pthread_t tid[THRNUM];
- int i,j,mark;
- int err;
- for(i =0;i<THRNUM;i++)
- {
- err= pthread_create(tid+(i),NULL,thr_add,NULL);
- if(err)
- {
- fprintf(stderr,"pthread_create():%sn",strerror(err));
- }
- }
-
- for(i=0;i<THRNUM;i++)
- {
- pthread_join(tid[i],NULL);
- }
- pthread_mutex_destroy(&mut);
- return 0;
- }
-
- void* thr_add(void*p)
- {
- FILE*fp;
- char line_buf[1024];
- int len_size = 1024;
-
- pthread_mutex_lock(&mut);
-
-
- fp = fopen(FILENAME,"r+");
- fgets(line_buf,len_size,fp);
-
- fseek(fp,0,SEEK_SET);
-
- fprintf(fp,"%d n",atoi(line_buf)+1);
- fclose(fp);
- pthread_mutex_unlock(&mut);
-
- pthread_exit(NULL);
-
- return NULL;
- }
abcd.c
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <pthread.h>
-
- #define FILENAME "/tmp/out"
- #define THRNUM (4)
-
- pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
-
- void* thr_abcd(void*p);
-
- int main()
- {
- pthread_t tid[THRNUM];
- int i,j,mark;
- int err;
- for(i =0;i<THRNUM;i++)
- {
- err= pthread_create(tid+(i),NULL,thr_abcd,(void*)i);
- if(err)
- {
- fprintf(stderr,"pthread_create():%sn",strerror(err));
- }
- }
- alarm(2);
-
- for(i=0;i<THRNUM;i++)
- {
- pthread_join(tid[i],NULL);
- }
- pthread_mutex_destroy(&mut);
- return 0;
- }
-
- void* thr_abcd(void*p)
- {
- int c = 'a'+ (int)p;
- while(1)
- {
- write(1,&c,1);
- }
-
- pthread_exit(NULL);
-
- return NULL;
- }
abcd.c
तालान् अनलॉक् कर्तुं च श्रृङ्खलायाः उपयोगं कुर्वन्तु।
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <pthread.h>
-
- #define FILENAME "/tmp/out"
- #define THRNUM (4)
-
- pthread_mutex_t mut[THRNUM];
-
- void* thr_abcd(void*p);
-
- int main()
- {
- pthread_t tid[THRNUM];
- int i,j,mark;
- int err;
- for(i =0;i<THRNUM;i++)
- {
- pthread_mutex_init(mut+i,NULL); //初始化四个锁
- pthread_mutex_lock(mut+i);
-
- err= pthread_create(tid+(i),NULL,thr_abcd,(void*)i);
- if(err)
- {
- fprintf(stderr,"pthread_create():%sn",strerror(err));
- }
- }
- pthread_mutex_unlock(mut+0);
- alarm(2);
-
- for(i=0;i<THRNUM;i++)
- {
- pthread_join(tid[i],NULL);
- }
- pthread_mutex_destroy(&mut);
- return 0;
- }
- int next(int n)
- {
- if(n +1 ==THRNUM)
- return 0;
- return n+1;
- }
- void* thr_abcd(void*p)
- {
- int c = 'a'+ (int)p;
- int n = (int)p;
- while(1)
- {
- pthread_mutex_lock(mut+n);
- write(1,&c,1);
- pthread_mutex_unlock(mut+next(n) );
- }
- pthread_exit(NULL);
-
- return NULL;
- }
पूल एल्गोरिदम् अभाज्य संख्यागणनां (प्रश्नविधिः) कार्यान्वितं करोति ।
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <pthread.h>
- #define LEFT 30000000
- #define RIGHT 30000200
- #define THRNUM (RIGHT-LEFT+1)
-
- void* thr_prime(void*p);
-
- int main()
- {
- pthread_t tid[THRNUM];
- int i,j,mark;
- int err;
- for(i =LEFT;i<=RIGHT;i++)
- {
- err= pthread_create(tid+(i-LEFT),NULL,thr_prime,(void *)i);
- // err= pthread_create(tid+(i-LEFT),NULL,thr_prime,&i);
- if(err)
- {
- fprintf(stderr,"pthread_create():%sn",strerror(err));
- }
- }
-
- for(i=LEFT;i<=RIGHT;i++)
- {
- pthread_join(tid[i-LEFT],NULL);
- }
-
- return 0;
- }
-
- void* thr_prime(void*p)
- {
- int i,j,mark;
-
- i = (int)p;
- // i = *(int*)p;
-
- mark = 1;
- for(j=2;j<i/2;j++)
- {
- if(i%j ==0)
- {
- mark = 0;
- break;
- }
- }
- if(mark)
- printf("%d is a primer n",i);
- pthread_exit(NULL);
- return NULL;
- }
संचारार्थं अधिसूचना अधिनियमः।
int pthread_cond_destroy (pthread_cond_t * cond);
int pthread_cond_init (pthread_cond_t * प्रतिबन्धित cond,
const pthread_condattr_t * प्रतिबन्ध attr);
pthread_cond_t cond = PTHREAD_COND_आरम्भक;
int pthread_cond_broadcast (pthread_cond_t * cond);
int pthread_cond_signal (pthread_cond_t * cond);//किसी भी प्रतीक्षा जागें
int pthread_cond_timedwait (pthread_cond_t * cond प्रतिबंधित करें, //समय समाप्त प्रतीक्षा
pthread_mutex_t * म्यूटेक्स प्रतिबन्धित,
const struct timespec * परहेज प्रतिबन्धित);
int pthread_cond_wait (pthread_cond_t * cond प्रतिबंधित करें, //死等
pthread_mutex_t * म्यूटेक्स प्रतिबन्धित करें);
mytbf.c (सूचना विधि) २.
- #include <stdlib.h>
- #include <stdio.h>
- #include <error.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <errno.h>
- #include <signal.h>
- #include <pthread.h>
-
- #include "mytbf.h"
-
- struct mytbf_st
- {
- int cps;
- int burst;
- int token;
- int pos;
- pthread_mutex_t mut;
- pthread_cond_t cond;
-
- };
- static pthread_mutex_t mut_job = PTHREAD_MUTEX_INITIALIZER;
- static pthread_t tid_alrm;
- pthread_once_t init_once = PTHREAD_ONCE_INIT;
-
- static struct mytbf_st* job[MYTBF_MAX];
-
- typedef void (*sighandler_t)(int);
-
-
- static int get_free_pos_unlocked(void)
- {
- for(int i=0;i< MYTBF_MAX;i++)
- {
- if(job[i]==NULL)
- return i;
- }
- return -1;
- }
-
- static void* thr_alrm(void*p)
- {
- while(1)
- {
- pthread_mutex_lock(&mut_job);
- for(int i=0;i<MYTBF_MAX;i++)
- {
- if(job[i] != NULL)
- {
- pthread_mutex_lock(&job[i]->mut);
- job[i]->token += job[i]->cps;
- if(job[i]->token >job[i]->burst )
- {
- job[i]->token = job[i]->burst;
- }
- pthread_cond_broadcast(&job[i]->cond);
- pthread_mutex_unlock(&job[i]->mut);
- }
- }
- pthread_mutex_unlock(&mut_job);
- sleep(1);
- }
- return NULL;
- }
-
- static void module_unload()
- {
- pthread_cancel(tid_alrm);
- pthread_join(tid_alrm,NULL);
- //只能一个人掉,二个人调用容易出差
- for(int i=0;i<MYTBF_MAX;i++)
- {
- if(job[i]!=NULL)
- {
- mytbf_destroy(job[i]);
- }
- }
- pthread_mutex_destroy(&mut_job);
-
- }
-
- static void module_load()
- {
- int err;
- err = pthread_create(&tid_alrm,NULL,thr_alrm,NULL);
- if(err)
- {
- fprintf(stderr,"create errorn");
- exit(1);
- }
- atexit(module_unload);
- }
-
- mytbf_t* mytbf_init(int cps ,int burst) //C语言中,void*可以赋值给任何类型的指针,任何类型的指针也都可以赋值给void*
- {
- struct mytbf_st*me;
- int pos;
- pthread_once(&init_once,module_load); //只初始化一次
- me = malloc(sizeof(*me));
- if(me == NULL)
- return NULL;
-
- me->cps = cps;
- me->burst = burst;
- me->token = 0;
-
- pthread_mutex_init(&me->mut,NULL);
- pthread_cond_init(&me->cond,NULL);
- pthread_mutex_lock(&mut_job);
-
- pos = get_free_pos_unlocked();
- if(pos < 0)
- {
-
- pthread_mutex_unlock(&mut_job);
- free(me);
- return NULL;
- }
- me->pos = pos;
- job[pos] = me;
-
- pthread_mutex_unlock(&mut_job);
-
- return me;
-
- }
- int mytbf_fetchtoken(mytbf_t*ptr,int size) //获取token
- {
- if(size <= 0)
- return -EINVAL; //参数非法
- struct mytbf_st*me = ptr;
- pthread_mutex_lock(&me->mut);
- while(me->token <= 0 ) //token为空就等待
- {
- pthread_cond_wait(&me->cond,&me->mut); //解锁等待,等待conad_broadcast和conad_signal的到来
-
- /*
- pthread_mutex_unlock(&me->mut);
- sched_yield();
- pthread_mutex_lock(&me->mut);
- */
- }
-
-
- int n = (me->token>size?size:me->token);
- me->token -= n;
- pthread_mutex_unlock(&me->mut);
- return n;
- }
-
- int mytbf_returntoken(mytbf_t*ptr,int size) //返还token
- {
- if(size<=0)
- return -EINVAL;
- struct mytbf_st*me = ptr;
-
- pthread_mutex_lock(&me->mut);
-
- me->token+= size;
- if(me->token > me->burst)
- me->token = me->burst;
- pthread_cond_broadcast(&me->cond);
- pthread_mutex_unlock(&me->mut);
- return size;
- }
-
- int mytbf_destroy(mytbf_t*ptr)
- {
- struct mytbf_st *me;
- me = ptr;
- pthread_mutex_lock(&mut_job);
- job[me->pos] = NULL;
- pthread_mutex_unlock(&mut_job);
- pthread_mutex_destroy(&me->mut);
- pthread_cond_destroy(&me->cond);
- free(ptr);
- return 0;
-
- }
प्राइमर0_पूल.ग
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <pthread.h>
- #include <sched.h>
-
- #define LEFT 30000000
- #define RIGHT 30000200
- #define THRNUM (4)
-
- static int num = 0;
- static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
- static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
-
- void* thr_prime(void*p);
-
- int main()
- {
- pthread_t tid[THRNUM];
- int i,j,mark;
- int err;
-
- for(i =0;i<=THRNUM;i++)
- {
- err= pthread_create(tid+(i),NULL,thr_prime,(void *)i);
- if(err)
- {
- fprintf(stderr,"pthread_create():%sn",strerror(err));
- }
- }
- //下发任务
- for(i=LEFT;i<RIGHT;i++)
- {
- pthread_mutex_lock(&mut);
- while(num !=0) //不是0就需要等待任务被取走
- {
- pthread_cond_wait(&cond,&mut);
- }
-
- num = i; //下发任务
- pthread_cond_signal(&cond); //下游叫醒任意一个
- pthread_mutex_unlock(&mut);
- }
- pthread_mutex_lock(&mut);
- while(num!= 0)
- {
- pthread_mutex_unlock(&mut);
- sched_yield(); //出让调度器给别的线程
- }
- num = -1; //用于线程退出
- pthread_cond_broadcast(&cond);
-
- pthread_mutex_unlock(&mut);
-
- for(i=0;i<=THRNUM;i++)
- {
- pthread_join(tid[i],NULL);
- }
- pthread_mutex_destroy(&mut);
- pthread_cond_destroy(&cond);
- return 0;
- }
-
- void* thr_prime(void*p)
- {
- int i,j,mark;
- while(1)
- {
- pthread_mutex_lock(&mut);
- while(num == 0)
- {
- pthread_cond_wait(&cond,&mut);
- }
- if(num == -1)
- {
- pthread_mutex_unlock(&mut); //走到这里必须要解锁。
- break;
- }
-
- i= num;
- num = 0;
- pthread_cond_broadcast(&cond);
-
- pthread_mutex_unlock(&mut);
-
- mark = 1;
- for(j=2;j<i/2;j++)
- {
- if(i%j ==0)
- {
- mark = 0;
- break;
- }
- }
- if(mark)
- printf("[%d]%d is a primer n",(int)p,i);
- }
-
- pthread_exit(NULL);
- return NULL;
- }
abcd_cond.c
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <pthread.h>
-
- #define FILENAME "/tmp/out"
- #define THRNUM (4)
-
- pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
- pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
- int num;
-
- void* thr_abcd(void*p);
-
- int main()
- {
- pthread_t tid[THRNUM];
- int i,j,mark;
- int err;
- for(i =0;i<THRNUM;i++)
- {
-
- err= pthread_create(tid+(i),NULL,thr_abcd,(void*)i);
- if(err)
- {
- fprintf(stderr,"pthread_create():%sn",strerror(err));
- }
- }
-
- alarm(2);
-
- for(i=0;i<THRNUM;i++)
- {
- pthread_join(tid[i],NULL);
- }
- pthread_cond_destroy(&cond);
- pthread_mutex_destroy(&mut);
- return 0;
- }
- int next(int n)
- {
- if(n +1 ==THRNUM)
- return 0;
- return n+1;
- }
- void* thr_abcd(void*p)
- {
- int c = 'a'+ (int)p;
- int n = (int)p;
- while(1)
- {
- pthread_mutex_lock(&mut);
- while(num != n)
- {
- pthread_cond_wait(&cond,&mut);
- }
- write(1,&c,1);
- num = next(num);
- pthread_cond_broadcast(&cond);
- pthread_mutex_unlock(&mut );
- }
- pthread_exit(NULL);
-
- return NULL;
- }
म्यूटेक्स् bool प्रकारस्य अस्ति, सेमाफोर् च int प्रकारस्य अस्ति यदि इदं पर्याप्तं नास्ति तर्हि प्रतीक्षते ।
mysem.c
- #include <stdlib.h>
- #include <stdio.h>
- #include <pthread.h>
- #include <string.h>
- #include <unistd.h>
- #include "mysem.h"
-
- struct mysem_st
- {
- int value;
- pthread_mutex_t mut;
- pthread_cond_t cond;
-
- };
-
- mysem_t* mysem_init(int initval)
- {
- struct mysem_st*me;
- me = malloc(sizeof(*me));
- if(me==NULL)
- return NULL;
- me->value = initval;
- pthread_mutex_init(&me->mut,NULL);
- pthread_cond_init(&me->cond,NULL);
-
- return me;
-
- }
-
- int mysem_add(mysem_t*ptr ,int n)
- {
- struct mysem_st*me = ptr;
-
- pthread_mutex_lock(&me->mut);
-
- me->value+= n;
- pthread_cond_broadcast(&me->cond);
- pthread_mutex_unlock(&me->mut);
-
- return n;
- }
-
- int mysem_sub(mysem_t*ptr ,int n )
- {
- struct mysem_st*me = ptr;
-
- pthread_mutex_lock(&me->mut);
- while(me->value <n)
- {
- pthread_cond_wait(&me->cond,&me->mut);
- }
- me->value -=n;
-
- pthread_mutex_unlock(&me->mut);
- return n;
- }
-
- void mysem_destroy(mysem_t*ptr)
- {
- struct mysem_st*me = ptr;
- pthread_mutex_destroy(&me->mut);
- pthread_cond_destroy(&me->cond);
- free(me);
- }
-
-
-
म्यसेम्.ह
- #ifndef MYSEM_H
- #define MYSEM_H
-
- typedef void mysem_t;
-
- mysem_t* mysem_init(int initval);
-
- int mysem_add(mysem_t*,int);
-
- int mysem_sub(mysem_t*,int);
-
- void mysem_destroy(mysem_t*);
-
-
-
- #endif
मुख्य.ग
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <pthread.h>
- #include "mysem.h"
-
- #define LEFT 30000000
- #define RIGHT 30000200
- #define THRNUM (RIGHT-LEFT+1)
-
- #define N 4
- static mysem_t* sem;
-
- void* thr_prime(void*p);
-
- int main()
- {
- pthread_t tid[THRNUM];
- int i,j,mark;
- int err;
-
- sem = mysem_init(N);
- if(sem ==NULL)
- {
- fprintf(stderr,"mysem_init n");
- exit(1);
- }
-
- for(i =LEFT;i<=RIGHT;i++)
- {
- mysem_sub(sem,1);
-
- err= pthread_create(tid+(i-LEFT),NULL,thr_prime,(void *)i);
- if(err)
- {
- fprintf(stderr,"pthread_create():%sn",strerror(err));
- }
- }
-
- for(i=LEFT;i<=RIGHT;i++)
- {
- pthread_join(tid[i-LEFT],NULL);
- }
-
- mysem_destroy(sem);
-
- return 0;
- }
-
- void* thr_prime(void*p)
- {
- int i,j,mark;
-
- i = (int)p;
- // i = *(int*)p;
-
- mark = 1;
- for(j=2;j<i/2;j++)
- {
- if(i%j ==0)
- {
- mark = 0;
- break;
- }
- }
- if(mark)
- printf("%d is a primer n",i);
-
- sleep(5); //ps ax -L 可以观察到对线程进行了限制,只创建了四个线程
-
- mysem_add(sem,1);
- pthread_exit(NULL);
-
- return NULL;
- }
makefile इति इति
- all:mysem
- CFLAGS+=-g -Wall -pthread
- LDFLAGS+= -pthread
-
- mysem:main.o mysem.o
- gcc $^ $(CFLAGS) $(LDFLAGS) -o $@
-
- clean:
- rm -rf *.o mysem
म्यूटेक्सस्य सेमाफोरस्य च व्यापकः प्रयोगः । read lock (semaphore) तथा write lock (mutex) इति विभक्तम् । सामान्यतया पठनलेखनयोः उच्चसीमा निर्धारितव्या ।
लेखकानां बुभुक्षायाः निवारणं आवश्यकम् ।
pthread_create इत्यस्य द्वितीयः पैरामीटर् थ्रेड् इत्यस्य विशेषता अस्ति ।
int pthread_attr_init (पीथ्रेड_attr_t * attr);
int pthread_attr_destroy (pthread_attr_t * attr);
परीक्षणकार्यक्रमेण निर्मितानाम् अधिकाधिकं सूत्राणां संख्या । () ९.
- #include <stdlib.h>
- #include <stdio.h>
- #include <pthread.h>
-
- void* func(void)
- {
- int i;
-
- // printf("%pn",&i);
- pthread_exit(NULL);
- return NULL;
- }
-
- int main()
- {
- int err;
- pthread_t tid;
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setstacksize(&attr,1024*1024); //1mb
-
- int i = 0;
- for(;;i++)
- {
- err = pthread_create(&tid,&attr,func,NULL);
- if(err)
- {
- fprintf(stderr,"create errn");
- break;
- }
- }
- printf("max = %d n",i);
- pthread_attr_destroy(&attr);
- return 0;
- }
म्यूटेक्स गुणाः : १.
int pthread_mutexattr_init (pthread_mutexattr_t * attr);
pthread_mutexattr_destroy () इति पश्यन्तु ।
int pthread_mutexattr_getpshared (const pthread_mutexattr_t * attr, //प्रक्रियाओं के पार काम करता है
int * pshared);
int pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, 1999।
int pshared);
//एकं बालप्रक्रिया रचयन्तु यत् सञ्चिकावर्णकसरणीं साझां कर्तुं शक्नोति भवान् तत् साझां न कर्तुं अपि चयनं कर्तुं शक्नोति। Linux इत्यस्य अन्तर्गतं प्रक्रियाणां सूत्राणां च भेदः नास्ति
int क्लोन (int (* fn) (शून्य *), शून्य * ढेर, int ध्वज, शून्य * arg, ...
/* pid_t * माता-पिता_tid, शून्य * tls, pid_t * बच्चा_tid */ );
int pthread_mutexattr_gettype (const pthread_mutexattr_t * प्रतिबन्ध attr,
int * प्रकार प्रतिबन्धित);
int pthread_mutexattr_settype (pthread_mutexattr_t * attr, int प्रकार);
कण्डिशन् चर गुणाः : १.
int pthread_condattr_destroy (pthread_condattr_t * attr);
int pthread_condattr_init (pthread_condattr_t * attr);
पठन-लेखन तालागुणाः : १.
पुनः प्रवेशकः कार्यं केवलं एकं कार्यं भवति यत् तस्य निष्पादनस्य समये कदापि एतत् कार्यं बाधितुं शक्नोति तथा च नियन्त्रणं प्रत्यागत्य अन्यस्य कोडस्य भागस्य निष्पादनार्थं OS scheduling इत्यत्र स्थानान्तरणं कर्तुं शक्नोति कार्याणि केचन प्रणालीसंसाधनानाम् उपयोगं कुर्वन्ति, यथा वैश्विकचरक्षेत्राणि, व्यत्ययसदिशसारणी इत्यादयः, अतः यदि ते बाधिताः भवन्ति तर्हि एतादृशाः कार्याणि बहुकार्यवातावरणे चालयितुं न शक्नुवन्ति
बहुसूत्रीकरणे IO । अनलॉक्ड् फंक्शन् (अ-पुनःप्रवेशकः फंक्शन्, बहु-थ्रेडेड् समवर्ती समर्थितः नास्ति) इत्यनेन समाप्तः भवति । man putc_unlocked, असमर्थित IO कार्याणि पश्यन्तु।
int pthread_sigmask (int कैसे, const sigset_t * सेट, sigset_t * oldset);
int sigwait (const sigset_t * सेट, int * सिग);
int pthread_kill (pthread_t धागा, int सिग);
आधिकारिकजालस्थलं पश्यन्तु: www.OpenMp.org
Openmp वाक्यविन्यासटैग्स् gcc4.0 इत्यस्य अनन्तरं समर्थिताः सन्ति ।केवलं कतिपयैः CPU-इत्यनेन कति समवर्तनानि प्राप्तुं शक्यन्ते ?
नमस्कार।ग
- #include <stdio.h>
- #include <stdlib.h>
-
- int main()
- {
- #pragma omp parallel //实现并发
- {
- puts("Hello ");
- puts(" World");
- }
- return 0;
- }
makefile इति इति
CFLAGS += -Wall -fopenmp
संकलितं नमस्कारं कृत्वा चालयन्तु।
- #include <stdio.h>
- #include <stdlib.h>
- #include <omp.h>
-
- int main()
- {
- #pragma omp parallel sections
- {
- #pragma omp section
- printf("[%d:]Hello n",omp_get_thread_num() );
- #pragma omp section
- printf("[%d:]World n",omp_get_thread_num() );
- }
- return 0;
- }