Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Linux϶àÏ̱߳à³ÌÏê½â
 
 
  8584  次浏览      27
 2020-11-19 
 
±à¼­ÍƼö:

±¾ÎÄÖ÷Òª½²½âÁËÏ̵߳Ĵ´½¨¡¢Ïß³ÌÊôÐÔÉèÖá¢Ï̲߳ÎÊý´«µÝ¡¢Ïß³ÌÓÅÏȼ¶¡¢Ï̵߳ÄÊý¾Ý´¦Àí¡¢Ï̵߳ķÖÀë״̬¡¢»¥³âËø¡¢ÐźÅÁ¿µÈÏà¹ØÄÚÈÝ¡£
±¾ÎÄÀ´×ÔÓÚ¼òÊ飬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼­¡¢ÍƼö¡£

Ò» Ï̴߳´½¨

·Ï»°²»¶à˵£¬ÏÈÉÏÒ»¸öḬ̈߳æµÄhelloworld¡£

#include <iostream>
using namespace std;

void *run(void *ptr){
for(int i=0; i<3; i++) {
sleep(1);
cout<<"hello world "<<i<<endl;
}
return 0;
}
int main(){
pthread_t id;
int ret=0;
ret=pthread_create(&id,NULL,run,NULL);
if(ret) {
cout<<"create thread failed "<<endl;
return 0;
}
pthread_join(id,NULL);
return 0;
}

ÔËÐкó

hello world 0
hello world 1
hello world 2

 

ÉÏÃæµÄ´úÂëºÜ¼òµ¥£¬¾ÍÊÇÆô¶¯Ò»¸öỊ̈߳¬È»ºóÏÈÏß³ÌÀïÑ­»·´òÓ¡×Ö¶Î×Ö·û´®¡£ÎÒÃǾÍÒÔÕâ¸ö×î¼òµ¥µÄÀý×ÓÀ´¿ª¿Ú¡£

1.1 pthread_create

´´½¨Ò»¸öỊ̈߳¬º¯ÊýµÄÉùÃ÷£º

int pthread_create (pthread_t* thread_out, pthread_attr_t const* attr,
void* (*start_routine)(void*), void* arg)

thread_out ´´½¨Ï̺߳óµÄ±êʶ·û£¬ÏÂÃæ»á½éÉÜ¡£

attr ÉèÖÃÏß³ÌÊôÐÔ¡£´«NULLΪĬÈÏÊôÐÔ£¨¶Ô´ó¶àÊý³ÌÐòÀ´Ëµ£¬Ê¹ÓÃĬÈÏÊôÐԾ͹»ÁË£©£¬µ±È»¾ßÌåʹÓÃÏÂÃæÒ²»á×ö½éÉÜ¡£

start_routine Ïß³ÌÔËÐк¯ÊýµÄÆðʼµØÖ·£¨¼òµ¥Ëµ¾ÍÊǺ¯ÊýÖ¸Õ룩¡£

arg ÔËÐк¯ÊýµÄ²ÎÊý£¬ÕâÀïÎÒÃÇûÓÐʹÓòÎÊý£¬¾ÍÖ±½ÓNULL¡£

´´½¨³É¹¦·µ»Ø0¡£Èô²»Îª0Ôò˵Ã÷´´½¨Ïß³Ìʧ°Ü£¬³£¼ûµÄ´íÎ󷵻شúÂëΪEAGAINºÍEINVAL¡£Ç°Õß±íʾϵͳÏÞÖÆ´´½¨ÐµÄỊ̈߳¬ÀýÈçÏß³ÌÊýÄ¿¹ý¶àÁË£»ºóÕß±íʾµÚ¶þ¸ö²ÎÊý´ú±íµÄÏß³ÌÊôÐÔÖµ·Ç·¨¡£

1.2 pthread_t

¶¨ÒåÔÚ pthreadtypes.hÖÐ

typedef unsigned long int pthread_t;

Ï̵߳ıêʶ·û¡£Ò²¾ÍÊÇÇ°Ãæ´´½¨Ïß³Ìʱºò´«ÈëµÄ²ÎÊý¡£µ±È»º¯Êý²ÎÊý×öÊäÈëµÄʱºò£¬´«µÄÊǵØÖ·¡£

¶þ Ïß³ÌÊôÐÔÉèÖÃ

ͬÑù£¬ÎÒÃÇÏÈÉÏʾÀý´úÂë

#include <iostream>
using namespace std;
void *run(void *ptr){
int value=*(int *)ptr;
for(int i=0; i<3; i++) {
sleep(1);
cout<<"value "<<value<<endl;
}
return 0;
}
int main(){
int ret=0;
int value=10;
pthread_t id;
pthread_attr_t attr;
//³õʼ»¯
pthread_attr_init(&attr);
//ÉèÖÃÏà¹ØÊôÐÔ
pthread_attr_setscope (&attr,PTHREAD_SCOPE_PROCESS);
ret=pthread_create(&id,&attr,run,&value);
if(ret) {
cout<<"create thread failed "<<endl;
return 0;
}
pthread_join(id,NULL);
return 0;
}

´úÂëÏà¶ÔÓÚÉÏÒ»½ÚÖжàÁËÒ»¸öÊôÐÔÉèÖúͲÎÊý´«µÝ¡£Éæ¼°±äÁ¿pthread_attr_t¡¢pthread_attr_initº¯ÊýµÈ¡£Õû¸öÁ÷³ÌÈý²½×ß

¶¨ÒåÊôÐÔ±äÁ¿pthread_attr_t

³õʼ»¯pthread_attr_t

´´½¨Ïß³Ìʱ´«Èë¡£

ÏÂÃæÎÒÃǾßÌå½éÉÜ

2.1 pthread_attr_t

ÊôÐÔ¶ÔÏóÖ÷Òª°üÀ¨ÊÇ·ñ°ó¶¨¡¢ÊÇ·ñ·ÖÀë¡¢¶ÑÕ»µØÖ·¡¢¶ÑÕ»´óС¡¢ÓÅÏȼ¶¡£Ä¬ÈϵÄÊôÐÔΪ·Ç°ó¶¨¡¢·Ç·ÖÀ롢ȱʡ1MµÄ¶ÑÕ»¡¢Ó븸½ø³ÌͬÑù¼¶±ðµÄÓÅÏȼ¶¡£pthread_attr_t½á¹¹µÄ¶¨Ò壬¶¨ÒåÔÚpthread.hÖÐ

typedef struct
{
uint32_t flags;
void * stack_base;
size_t stack_size;
size_t guard_size;
int32_t sched_policy;
int32_t sched_priority;
} pthread_attr_t;

2.2 ÊôÐÔÉèÖÃ

ÊôÐÔÖµ²»ÄÜÖ±½ÓÉèÖã¬ÐëʹÓÃÏà¹Øº¯Êý½øÐвÙ×÷£¬³õʼ»¯µÄº¯ÊýΪpthread_attr_init£¬Õâ¸öº¯Êý±ØÐëÔÚpthread_createº¯Êý֮ǰµ÷Óá£

µ÷ÓÃÏà¹ØÊôÐÔÉèÖõķ½·¨pthread_attr_set¡Á¡Á¡Á¼´¿É¡£

ÏÂÃæÁоÙÏà¹ØÊôÐÔ²Ù×÷º¯Êý£¬¾ßÌå·½·¨º¬Òå¾Í²»×ö½éÉÜ¡£

int pthread_attr_init (pthread_attr_t * attr);
int pthread_attr_destroy (pthread_attr_t * attr);
int pthread_attr_setdetachstate (pthread_attr_t * attr, int state);
int pthread_attr_getdetachstate (pthread_attr_t const * attr, int * state);
int pthread_attr_setschedpolicy (pthread_attr_t * attr, int policy);
int pthread_attr_getschedpolicy(pthread_attr_t const * attr, int * policy);
int pthread_attr_setschedparam(pthread_attr_t * attr, struct sched_param const * param);
int pthread_attr_getschedparam(pthread_attr_t const * attr, struct sched_param * param);
int pthread_attr_setstacksize(pthread_attr_t * attr, size_t stack_size);
int pthread_attr_getstacksize(pthread_attr_t const * attr, size_t * stack_size);
int pthread_attr_setstackaddr(pthread_attr_t * attr, void * stackaddr);
int pthread_attr_getstackaddr(pthread_attr_t const * attr, void ** stackaddr);
int pthread_attr_setstack(pthread_attr_t * attr, void * stackaddr, size_t stack_size);
int pthread_attr_getstack(pthread_attr_t const * attr, void ** stackaddr, size_t * stack_size);
int pthread_attr_setguardsize(pthread_attr_t * attr, size_t guard_size);
int pthread_attr_getguardsize(pthread_attr_t const * attr, size_t * guard_size);
int pthread_attr_setscope(pthread_attr_t *attr, int scope);
int pthread_attr_getscope(pthread_attr_t const *attr);
int pthread_getattr_np(pthread_t thid, pthread_attr_t * attr);

Èý Ï̲߳ÎÊý´«µÝ

´úÂ뻹ÊÇÉÏÒ»½ÚµÄʾÀý´úÂë¡£

²ÎÊý´«µÝµÄÊÇÖ¸Õë¡£ÎÒÃǽ«valueµÄÖµ´«Èë¡£

pthread_create(&id,&attr,run,&value);

È»ºó½øÐÐÖ¸Õë±äÁ¿ÀàÐÍת»»¾Í¿ÉµÃµ½Öµ¡£

int value=*(int *)ptr;

ËÄ Ïß³ÌÓÅÏȼ¶

ÏÈÉÏ´úÂë,ÕâÀïÏà¶ÔÓÚÉÏÒ»½Ú¾ÍÐÞ¸ÄÁË main·½·¨£¬ËùÒÔÖ»Ìù³ö²¿·Ö´úÂë

int main(){
int ret=0;
int value=10;
pthread_t id;
pthread_attr_t attr;
sched_param param;
//³õʼ»¯
pthread_attr_init(&attr);
//ÉèÖÃÏà¹ØÊôÐÔ
pthread_attr_setscope (&attr,PTHREAD_SCOPE_PROCESS);
//»ñÈ¡Ïß³ÌÓÅÏȼ¶²ÎÊý
pthread_attr_getschedparam(&attr,&param);
//ÉèÖÃÓÅÏȼ¶
param.sched_priority=10;
pthread_attr_setschedparam(&attr,&param);
ret=pthread_create(&id,&attr,run,&value);
if(ret) {
cout<<"create thread failed "<<endl;
return 0;
}
pthread_join(id,NULL);
return 0;
}

Ö÷񻃾¼°sched_param¡¢pthread_attr_setschedparam¡¢pthread_attr_getschedparamµÈ·½·¨¡£ÓÅÏȼ¶±äÁ¿´æ·ÅÔڽṹsched_paramÖС£Óú¯Êýpthread_attr_getschedparamºÍº¯Êýpthread_attr_setschedparam½øÐдæ·Å£¬Ò»°ã˵À´£¬ÎÒÃÇ×ÜÊÇÏÈÈ¡ÓÅÏȼ¶£¬¶ÔÈ¡µÃµÄÖµÐ޸ĺóÔÙ´æ·Å»ØÈ¥¡£

Îå Ï̵߳ķÖÀë״̬

Ï̵߳ķÖÀë״̬¾ö¶¨Ò»¸öÏß³ÌÒÔʲôÑùµÄ·½Ê½À´ÖÕÖ¹×Ô¼º¡£

ÔÚÉÏÃæµÄÀý×ÓÖУ¬ÎÒÃDzÉÓÃÁËÏ̵߳ÄĬÈÏÊôÐÔ£¬¼´Îª·Ç·ÖÀë״̬£¬ÕâÖÖÇé¿öÏ£¬Ô­ÓеÄÏ̵߳ȴý´´½¨µÄÏ߳̽áÊø¡£Ö»Óе±pthread_join£¨£©º¯Êý·µ»ØÊ±£¬´´½¨µÄÏ̲߳ÅËãÖÕÖ¹£¬²ÅÄÜÊÍ·Å×Ô¼ºÕ¼ÓõÄϵͳ×ÊÔ´¡£¶ø·ÖÀëÏ̲߳»ÊÇÕâÑù×ӵģ¬ËüûÓб»ÆäËûµÄÏß³ÌËùµÈ´ý£¬×Ô¼ºÔËÐнáÊøÁË£¬Ïß³ÌÒ²¾ÍÖÕÖ¹ÁË£¬ÂíÉÏÊÍ·Åϵͳ×ÊÔ´¡£³ÌÐòÔ±Ó¦¸Ã¸ù¾Ý×Ô¼ºµÄÐèÒª£¬Ñ¡ÔñÊʵ±µÄ·ÖÀë״̬¡£ÉèÖÃÏ̷߳ÖÀë״̬µÄº¯ÊýΪpthread_attr_setdetachstate£¨pthread_attr_t *attr, int detachstate£©¡£µÚ¶þ¸ö²ÎÊý¿ÉѡΪPTHREAD_CREATE_DETACHED£¨·ÖÀëỊ̈߳©ºÍ PTHREAD _CREATE_JOINABLE£¨·Ç·ÖÀëỊ̈߳©¡£ÕâÀïҪעÒâµÄÒ»µãÊÇ£¬Èç¹ûÉèÖÃÒ»¸öÏß³ÌΪ·ÖÀëỊ̈߳¬¶øÕâ¸öÏß³ÌÔËÐÐÓַdz£¿ì£¬ËüºÜ¿ÉÄÜÔÚpthread_createº¯Êý·µ»ØÖ®Ç°¾ÍÖÕÖ¹ÁË£¬ËüÖÕÖ¹ÒÔºó¾Í¿ÉÄܽ«Ï̺߳źÍϵͳ×ÊÔ´ÒÆ½»¸øÆäËûµÄÏß³ÌʹÓã¬ÕâÑùµ÷ÓÃpthread_createµÄÏ߳̾͵õ½ÁË´íÎóµÄÏ̺߳š£Òª±ÜÃâÕâÖÖÇé¿ö¿ÉÒÔ²Éȡһ¶¨µÄͬ²½´ëÊ©£¬×î¼òµ¥µÄ·½·¨Ö®Ò»ÊÇ¿ÉÒÔÔÚ±»´´½¨µÄÏß³ÌÀïµ÷ÓÃpthread_cond_timewaitº¯Êý£¬ÈÃÕâ¸öÏ̵߳ȴýÒ»»á¶ù£¬Áô³ö×ã¹»µÄʱ¼äÈú¯Êýpthread_create·µ»Ø¡£ÉèÖÃÒ»¶ÎµÈ´ýʱ¼ä£¬ÊÇÔÚ¶àÏ̱߳à³ÌÀï³£Óõķ½·¨¡£µ«ÊÇ×¢ÒⲻҪʹÓÃÖîÈçwait()Ö®ÀàµÄº¯Êý£¬ËüÃÇÊÇʹÕû¸ö½ø³Ì˯Ãߣ¬²¢²»Äܽâ¾öÏß³Ìͬ²½µÄÎÊÌâ¡£

Áù Ï̵߳ÄÊý¾Ý´¦Àí

6.1 Ïß³ÌÊý¾Ý

ÔÚµ¥Ï̵߳ijÌÐòÀÓÐÁ½ÖÖ»ù±¾µÄÊý¾Ý£ºÈ«¾Ö±äÁ¿ºÍ¾Ö²¿±äÁ¿¡£µ«ÔÚ¶àÏ̳߳ÌÐòÀ»¹ÓеÚÈýÖÖÊý¾ÝÀàÐÍ£ºÏß³ÌÊý¾Ý£¨TSD: Thread-Specific Data£©¡£ËüºÍÈ«¾Ö±äÁ¿ºÜÏó£¬ÔÚÏß³ÌÄÚ²¿£¬¸÷¸öº¯Êý¿ÉÒÔÏóʹÓÃÈ«¾Ö±äÁ¿Ò»Ñùµ÷ÓÃËü£¬µ«Ëü¶ÔÏß³ÌÍⲿµÄÆäËüÏß³ÌÊDz»¿É¼ûµÄ¡£ÕâÖÖÊý¾ÝµÄ±ØÒªÐÔÊÇÏÔ¶øÒ×¼ûµÄ¡£ÀýÈçÎÒÃdz£¼ûµÄ±äÁ¿errno£¬Ëü·µ»Ø±ê×¼µÄ³ö´íÐÅÏ¢¡£ËüÏÔÈ»²»ÄÜÊÇÒ»¸ö¾Ö²¿±äÁ¿£¬¼¸ºõÿ¸öº¯Êý¶¼Ó¦¸Ã¿ÉÒÔµ÷ÓÃËü£»µ«ËüÓÖ²»ÄÜÊÇÒ»¸öÈ«¾Ö±äÁ¿£¬·ñÔòÔÚAÏß³ÌÀïÊä³öµÄºÜ¿ÉÄÜÊÇBÏ̵߳ijö´íÐÅÏ¢¡£ÒªÊµÏÖÖîÈç´ËÀàµÄ±äÁ¿£¬ÎÒÃǾͱØÐëʹÓÃÏß³ÌÊý¾Ý¡£ÎÒÃÇΪÿ¸öÏß³ÌÊý¾Ý´´½¨Ò»¸ö¼ü£¬ËüºÍÕâ¸ö¼üÏà¹ØÁª£¬ÔÚ¸÷¸öÏß³ÌÀ¶¼Ê¹ÓÃÕâ¸ö¼üÀ´Ö¸´úÏß³ÌÊý¾Ý£¬µ«ÔÚ²»Í¬µÄÏß³ÌÀÕâ¸ö¼ü´ú±íµÄÊý¾ÝÊDz»Í¬µÄ£¬ÔÚͬһ¸öÏß³ÌÀËü´ú±íͬÑùµÄÊý¾ÝÄÚÈÝ¡£

×ܽáÉÏÃæµÄÀíÂÛ£ºÎÒÃÇÒªÔÚÏß³ÌÖÐʹÓÃÈ«¾Ö±äÁ¿£¬µ«ÊÇÕâ¸öÈ«¾Ö±äÁ¿ÔÚ¸÷¸öÏß³ÌÖÐÊǶÀÁ¢µÄ¡£

ÏÈÉÏ´úÂ룺

#include <iostream>
using namespace std;
//Óû§·ÃÎʺͻñÈ¡Ï̱߳äÁ¿¡£ËùÓеÄÏ̶߳¼¿ÉÒÔ·ÃÎÊ
pthread_key_t key;
void *run(void *ptr){
int value=*(int *)ptr;
int temp=1;
//½«tempµÄµØÖ·¸³¸økey¡£
pthread_setspecific (key, &temp);
for(int i=0; i<3; i++) {
//¸ù¾Ýkey»ñÈ¡¶ÔÓ¦µÄÖµ
int v=*(int *)pthread_getspecific(key);
usleep(1000*100);
cout<<"run key value>> "<<v<<endl<<flush;
}
return 0;
}
void *run2(void *ptr){
int temp=2;
pthread_setspecific (key, &temp);
for(int i=0; i<3; i++) {
int v=*(int *)pthread_getspecific(key);
usleep(1000*150);
cout<<"run2 key value>> "<<v<<endl<<flush;
}
return 0;
}
int main(){
//´´½¨key
pthread_key_create(&key,NULL);
int ret=0;
int value=10;
pthread_t id;
pthread_attr_t attr;
sched_param param;
//³õʼ»¯
pthread_attr_init(&attr);
//ÉèÖÃÏà¹ØÊôÐÔ
pthread_attr_setscope (&attr,PTHREAD_SCOPE_PROCESS);
//»ñÈ¡Ïß³ÌÓÅÏȼ¶²ÎÊý
pthread_attr_getschedparam(&attr,&param);
//ÉèÖÃÓÅÏȼ¶
param.sched_priority=10;
pthread_attr_setschedparam(&attr,&param);
ret=pthread_create(&id,&attr,run,&value);
if(ret) {
cout<<"create thread failed "<<endl;
return 0;
}
pthread_t id2;
ret=pthread_create(&id2,NULL,run2,NULL);
if(ret) {
cout<<"create thread 2 failed "<<endl;
return 0;
}
pthread_join(id,NULL);
pthread_join(id2,NULL);
pthread_key_delete(key);
return 0;
}

Ïà¹ØµÄº¯ÊýºÍ½á¹¹ÓÐpthread.hÖÐpthread_key_create¡¢pthread_key_delete¡¢pthread_key_t¡¢pthread_setspecific¡¢pthread_getspecific

pthread_key_create

´´½¨º¯ÊýÉùÃ÷:

int pthread_key_create(pthread_key_t *key, void (*destructor_function)(void *))

º¯Êý pthread_key_create() ÓÃÀ´´´½¨Ïß³Ì˽ÓÐÊý¾Ý¡£¸Ãº¯Êý´Ó TSD ³ØÖзÖÅäÒ»Ï½«ÆäµØÖ·Öµ¸³¸ø key ¹©ÒÔºó·ÃÎÊʹÓá£

pthread_key_t key

Ö¸ÏòÒ»¸ö¼üÖµµÄÖ¸Õë pthread_key_tµÄ¶¨ÒåΪtypedef int pthread_key_t;²»ÂÛÄĸöÏ̵߳÷ÓÃÁË pthread_key_create()£¬Ëù´´½¨µÄ key ¶¼ÊÇËùÓÐÏ߳̿ÉÒÔ·ÃÎʵ쬵«¸÷¸öÏ߳̿ÉÒÔ¸ù¾Ý×Ô¼ºµÄÐèÒªÍù key ÖÐÌîÈ벻ͬµÄÖµ£¬Ï൱ÓÚÌṩÁËÒ»¸öͬÃû¶ø²»Í¬ÖµµÄÈ«¾Ö±äÁ¿(Õâ¸öÈ«¾Ö±äÁ¿Ïà¶ÔÓÚÓµÓÐÕâ¸ö±äÁ¿µÄÏß³ÌÀ´Ëµ)¡£

destructor_function

ÕâÊÇÒ»¸öÏú»Ùº¯Êý£¬ËüÊÇ¿ÉÑ¡µÄ£¬¿ÉÒÔΪ NULL£¬Îª NULL ʱ£¬Ôòϵͳµ÷ÓÃĬÈϵÄÏú»Ùº¯Êý½øÐÐÏà¹ØµÄÊý¾Ý×¢Ïú¡£Èç¹û²»Îª¿Õ£¬ÔòÔÚÏß³ÌÍ˳öʱ(µ÷Óà pthread_exit() º¯Êý)ʱ½«ÒÔ key Ëø¹ØÁªµÄÊý¾Ý×÷Ϊ²ÎÊýµ÷ÓÃËü£¬ÒÔÊÍ·Å·ÖÅäµÄ»º³åÇø£¬»òÊǹرÕÎļþÁ÷µÈ¡£

pthread_setspecific/pthread_getspecific

ÉèÖúͻñÈ¡Ï̱߳äÁ¿µÄÖµ¡£

Æß »¥³âËø

»¥³âËøÓÃÀ´±£Ö¤Ò»¶Îʱ¼äÄÚÖ»ÓÐÒ»¸öÏß³ÌÔÚÖ´ÐÐÒ»¶Î´úÂë¡£±ØÒªÐÔÏÔ¶øÒ×¼û£º¼ÙÉè¸÷¸öÏß³ÌÏòͬһ¸öÎļþ˳ÐòдÈëÊý¾Ý£¬×îºóµÃµ½µÄ½á¹ûÒ»¶¨ÊÇÔÖÄÑÐԵġ£

ÏÈÉÏ´úÂ룬ÕâÀïÎÒÃÇ×öÁËÒ»¸ö¶ÁдģÐÍ£º

#include <iostream>
using namespace std;
char buffer;
int buffer_has_item=0;
pthread_mutex_t mutex;
void writerFunc(){
while(1) {
/* Ëø¶¨»¥³âËø*/
pthread_mutex_lock (&mutex);
buffer_has_item++;
cout<<"write "<<buffer_has_item<<endl;
/* ´ò¿ª»¥³âËø*/
pthread_mutex_unlock(&mutex);
usleep(1000*200);
}
}
void *readerFunc(void *ptr){
while(1) {
pthread_mutex_lock(&mutex);
if(buffer_has_item>0) {
cout<<"read >>>> "<<buffer_has_item<<endl;
buffer_has_item--;
}
pthread_mutex_unlock(&mutex);
usleep(1000*500);
}
}
int main(){
pthread_t id;
pthread_mutex_init (&mutex,NULL);
pthread_create(&id, NULL,readerFunc, NULL);
writerFunc();
return 0;
}

½á¹û£º

[root@localhost threadDemo]# ./second
write 1
read >>>> 1
write 1
write 2
read >>>> 2
write 2
write 3
read >>>> 3

7.1 ºËÐÄÁ÷³Ì

¶¨ÒåÒ»¸öËø(pthread_mutex_t)

³õʼ»¯Ëø

ʹÓÃpthread_mutex_lock/pthread_mutex_unlock½øÐÐËø¶¨ºÍ½âËø¡£

ÏÈ¿´Ï »¥³âËøpthread_mutex_tµÄ¶¨Òå

typedef struct
{
int volatile value;
} pthread_mutex_t;

ʹÓÃǰÐèÒª³õʼ»¯»¥³âËøpthread_mutex_init

7.2 Ëø¶¨ºÍ½âËø

pthread_mutex_lock ÉùÃ÷¿ªÊ¼Óû¥³âËøÉÏËø£¬´ËºóµÄ´úÂëÖ±ÖÁµ÷ÓÃpthread_mutex_unlockΪֹ£¬¾ù±»ÉÏËø£¬¼´Í¬Ò»Ê±¼äÖ»Äܱ»Ò»¸öÏ̵߳÷ÓÃÖ´ÐС£µ±Ò»¸öÏß³ÌÖ´Ðе½pthread_mutex_lock´¦Ê±£¬Èç¹û¸ÃËø´Ëʱ±»ÁíÒ»¸öÏß³ÌʹÓã¬ÄÇ´ËÏ̱߳»×èÈû£¬¼´³ÌÐò½«µÈ´ýµ½ÁíÒ»¸öÏß³ÌÊÍ·Å´Ë»¥³âËø

7.3 »¥³âËøÆäËûÏà¹Ø·½·¨

pthread_mutexattr_setpsharedÉèÖÃÊôÐÔpshared¡£¿ÉÒÔÈ¡£º

PTHREAD_PROCESS_SHARED ²»Í¬½ø³ÌÖеÄÏß³Ìͬ²½

PTHREAD_PROCESS_PRIVATE ͬ½ø³ÌÖеIJ»Í¬Ïß³Ìͬ²½

pthread_mutexattr_settype ÉèÖû¥³âËøÀàÐÍ

ÆäËû£º

int pthread_mutexattr_init(pthread_mutexattr_t *attr);
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *type);
int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);
int pthread_mutexattr_getpshared(pthread_mutexattr_t *attr, int *pshared);
int pthread_mutex_init(pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
#if 0 /* MISSING FROM BIONIC */
int pthread_mutex_timedlock(pthread_mutex_t *mutex, struct timespec* ts);
#endif /* MISSING */

°Ë Ìõ¼þ±äÁ¿

ǰһ½ÚÖÐÎÒÃǽ²ÊöÁËÈçºÎʹÓû¥³âËøÀ´ÊµÏÖÏ̼߳äÊý¾ÝµÄ¹²ÏíºÍͨÐÅ£¬»¥³âËøÒ»¸öÃ÷ÏÔµÄȱµãÊÇËüÖ»ÓÐÁ½ÖÖ״̬£ºËø¶¨ºÍ·ÇËø¶¨¡£¶ÔÓÚÏû·ÑÕߣ¬Ëü¸ù±¾²»ÖªµÀʲôʱºòÉú²úÕßÒѾ­Éú²úÁËÊý¾Ý£¬Ö»ÄÜͨ¹ýÂÖѯÀ´¼ì²â£¬Õâ¾ÍÓÐÁ½¸öȱÏÝ£º

ÂÖѯ»áÕ¼ÓÃCPU×ÊÔ´

ÂÖѯµÄʱ¼ä²»ºÃ¿ØÖÆ£¬¿ÉÄܵ¼ÖÂÏû·ÑÕßÖ´Ðв»¼°Ê±¡£

ΪÁ˽â¾öÉÏÃæÕâ¸öÎÊÌ⣬ÎÒÃÇÕâÑù¿¼ÂÇ¡£·ÑÏß³ÌÔÚ×èÈû֮ǰҪÏȽâËø£¨¸öÈËÏë·¨£ºÏû·ÑÏß³ÌÒѾ­»ñµÃÁËÒª·ÃÎÊ×ÊÔ´µÄËø£¬µ«ÊÇ£¬¼´Ê¹ÎÒ»ñµÃÁË×ÊÔ´µÄËø£¬µ«ÊÇÓÉÓÚÌõ¼þÔÝʱ»¹²»Âú×㣬ÎÒÎÞ·¨ÓÃÕâ¸ö×ÊÔ´£¬ËùÒÔÎÒÏëÔÝʱÈóöÕâ°ÑËø£¬ÈÃÖ®ÀïµÄ×ÊÔ´ÔÝʱΪ±ðÈËËùÓã¬ËùÒÔÔÚ¹ÒÆðǰ£¬ÎÒÐèÒª½âËø£©£¬Í¬Ê±»¹Òª½«×Ô¼ºµÄ±êʶ·û·ÅÈëÒ»¸öµØ·½£¬ÒÔ±ãÉú²úÏß³Ìͨ¹ýÕâ¸ö±êʶ·ûÀ´¼¤»î×Ô¼º¡£ÄÇÐÂÎÊÌâÓÖÀ´ÁË£¬ÓÉÓÚÏß³ÌÖ®¼äÊDz¢·¢/²¢Ðеġ£Ïû·ÑÏ߳̿ÉÄܸÕÍê³É½âËøµÄ²Ù×÷£¬¾Í±»Éú²úÏ̻߳ñÈ¡µ½Á˲¢¿ªÊ¼Ö´ÐУ¬Õâʱ£¬ÒòΪÏû·ÑÏ̻߳¹Î´¹ÒÆð×Ô¼º£¬À´²»¼°½«×Ô¼ºµÄ±êʶ·û±£´æÔÚij¸öλÖã¬ËùÒÔÉú²úÏ̲߳»ÈÏΪÓÐÕýÔڵȴýµÄỊ̈߳¨Éú²úÏß³ÌÏë¸æËßÏû·ÑÏ̵߳ÄΨһ·½Ê½¾ÍÊÇÈÏÏû·ÑÏ̵߳ıêʶ·û£©¡£Õâʱ£¬Çл»µ½Ïû·ÑÏ̺߳ó£¬Ïû·ÑÏ߳̽«ÓÀÔ¶µÄµÈ´ýÏÂÈ¥£¬ËäÈ»¶ÓÁÐÖÐÓвúÆ·£¬µ«Éú²úÏß³ÌÒ²²»»á¸æËßÏû·ÑÏ̡߳£¶øÉú²úÏß³ÌÒòΪ¶ÓÁÐÖÐÓвúÆ·¿ÉÄÜÒ²Ò»Ö±µÄµÈ´ýÏÂÈ¥£¬ÐγÉÁËËÀËø¡£

ÕâÀïËÀËøµÄÔ­ÒòºÜÃ÷È·£¬¾ÍÊÇÒòΪÏû·ÑÏß³ÌÔÚ×èÈû֮ǰҪÏȽâËø½â¡¢±£´æÏ̱߳êʶ·û¡¢¹ÒÆðÕâһϵÁвÙ×÷²»ÊÇÔ­×Ó²Ù×÷¡£ÏëÒªÈÃÕâһЩÁеIJÙ×÷³ÉΪԭ×Ó²Ù×÷£¬¾ÍµÃÒýÈëÌõ¼þ±äÁ¿£¬ËùÒÔ²»ÄÑÏ뵽ʹÓÃÌõ¼þ±äÁ¿µÄʱºò±ØÐëÒª¡°°éËæ¡±Ò»¸ö»¥³âÁ¿¡£

Ìõ¼þ±äÁ¿ÊÇÓ뻥³âÁ¿Ïà¹ØÁªµÄÒ»ÖÖÓÃÓÚ¶àÏß³ÌÖ®¼ä¹ØÓÚ¹²ÏíÊý¾Ý״̬¸Ä±äµÄͨÐÅ»úÖÆ¡£Ëü½«½âËøºÍ¹ÒÆð·â×°³ÉΪԭ×Ó²Ù×÷¡£µÈ´ýÒ»¸öÌõ¼þ±äÁ¿Ê±£¬»á½â¿ªÓë¸ÃÌõ¼þ±äÁ¿Ïà¹ØµÄËø£¬Òò´Ë£¬Ê¹ÓÃÌõ¼þ±äÁ¿µÈ´ýµÄǰÌáÖ®Ò»¾ÍÊDZ£Ö¤»¥³âÁ¿¼ÓËø¡£Ïß³ÌÐÑÀ´Ö®ºó£¬¸Ã»¥³âÁ¿»á±»×Ô¶¯¼ÓËø£¬ËùÒÔ£¬ÔÚÍê³ÉÏà¹Ø²Ù×÷Ö®ºóÐèÒª½âËø¡£

ÓÃÌõ¼þ±äÁ¿ÅäºÏ»¥³âÁ¿ÊµÏÖ£¬Ìõ¼þ±äÁ¿Ó뻥³âÁ¿½áºÏ£¬Ê¹µÃÔÚÌõ¼þ²»Âú×ãµÄÇé¿öÏ£¬Äܹ»ÊͷŶԻº³åÇøµÄÕ¼Óã¬Ê¹µÃËûÈËÄܹ»·ÃÎÊ»º³åÇø¡£µ±ÎÒÌí¼ÓÂú×ãʱ£¬ÎÒÓÖ¿ÉÒÔ¼°Ê±µÄ¼ÓËøÖ®ºó¶ÀÕ¼×ÊÔ´µÄÍê³ÉÎÒ×Ô¼ºµÄ¹¤×÷¡£

ÎÒÃÇÏÈÉϲâÊÔ´úÂ룺

#include <iostream>
using namespace std;
int buffer_has_item=0;
pthread_mutex_t mutex;
pthread_cond_t count_nonzero;
void writerFunc(){
while(1) {
pthread_mutex_lock (&mutex);
buffer_has_item+=2;
cout<<"write "<<buffer_has_item<<endl;
pthread_mutex_unlock(&mutex);
//¼¤»î×èÈûµÄ¶ÁÏß³Ì
pthread_cond_signal(&count_nonzero);
usleep(1000*200);
}
}
void *readerFunc(void *ptr){
while(1) {
pthread_mutex_lock(&mutex);
if(buffer_has_item<=0) {
//ÔÝʱ½âËø£¬°Ñ×ÊÔ´Èóö£¬µÈ´ýдÏß³ÌдÈë¡£
//±»¼¤»îºó»á×Ô¶¯¼ÓËø
pthread_cond_wait( &count_nonzero, &mutex);
}
cout<<"read >>>> "<<buffer_has_item<<endl;
buffer_has_item--;
pthread_mutex_unlock(&mutex);
}
}
int main(){
pthread_t id;
pthread_mutex_init (&mutex,NULL);
pthread_create(&id, NULL,readerFunc, NULL);
writerFunc();
return 0;
}

 

Ö÷񻃾¼°ÄÚÈÝÓÐpthread_cond_t¡¢pthread_cond_signal¡¢pthread_cond_wait¡£

pthread_condattr_tµÄ¶¨ÒåΪ

typedef long pthread_condattr_t;

ÓÃÀ´¶¨ÒåÌõ¼þ±äÁ¿¡£

pthread_cond_wait

Ï߳̽⿪mutexÖ¸ÏòµÄËø²¢±»Ìõ¼þ±äÁ¿cond×èÈû¡£Ï߳̿ÉÒÔ±»º¯Êýpthread_cond_signalºÍº¯Êýpthread_cond_broadcast»½ÐÑ¡££¬µ«ÊÇҪעÒâµÄÊÇ£¬Ìõ¼þ±äÁ¿Ö»ÊÇÆð×èÈûºÍ»½ÐÑÏ̵߳Ä×÷Ó㬾ßÌåµÄÅжÏÌõ¼þ»¹ÐèÓû§¸ø³ö£¬ÀýÈçÒ»¸ö±äÁ¿ÊÇ·ñ<=0µÈµÈ

pthread_cond_signal

ÓÃÀ´Êͷű»×èÈûÔÚÌõ¼þ±äÁ¿condÉϵÄÒ»¸öÏ̡߳£¶à¸öÏß³Ì×èÈûÔÚ´ËÌõ¼þ±äÁ¿ÉÏʱ£¬ÄÄÒ»¸öÏ̱߳»»½ÐÑÊÇÓÉÏ̵߳ĵ÷¶È²ßÂÔËù¾ö¶¨µÄ¡£

ÆäËûÏà¹Øº¯Êý£º

int pthread_condattr_init(pthread_condattr_t *attr);
int pthread_condattr_getpshared(pthread_condattr_t *attr, int *pshared);
int pthread_condattr_setpshared(pthread_condattr_t* attr, int pshared);
int pthread_condattr_destroy(pthread_condattr_t *attr);
int pthread_cond_init(pthread_cond_t *cond,
const pthread_condattr_t *attr);
int pthread_cond_destroy(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_timedwait(pthread_cond_t *cond,
pthread_mutex_t * mutex,
const struct timespec *abstime);
/* BIONIC: same as pthread_cond_timedwait, except the 'abstime' given refers
* to the CLOCK_MONOTONIC clock instead, to avoid any problems when
* the wall-clock time is changed brutally
*/
int pthread_cond_timedwait_monotonic_np(pthread_cond_t *cond,
pthread_mutex_t *mutex,
const struct timespec *abstime);
/* BIONIC: DEPRECATED. same as pthread_cond_timedwait_monotonic_np()
* unfortunately pthread_cond_timedwait_monotonic has shipped already
*/
int pthread_cond_timedwait_monotonic(pthread_cond_t *cond,
pthread_mutex_t *mutex,
const struct timespec *abstime);
#define HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC 1
/* BIONIC: same as pthread_cond_timedwait, except the 'reltime' given refers
* is relative to the current time.
*/
int pthread_cond_timedwait_relative_np(pthread_cond_t *cond,
pthread_mutex_t *mutex,
const struct timespec *reltime);
#define HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE 1

int pthread_cond_timeout_np(pthread_cond_t *cond,
pthread_mutex_t * mutex,
unsigned msecs);

¾Å ÐźÅÁ¿

Ï̵߳ÄÐźÅÁ¿Óë½ø³Ì¼äͨÐÅÖÐʹÓõÄÐźÅÁ¿µÄ¸ÅÄîÊÇÒ»Ñù£¬ËüÊÇÒ»ÖÖÌØÊâµÄ±äÁ¿£¬±¾ÖÊÉÏÊÇÒ»¸ö·Ç¸ºµÄÕûÊý¼ÆÊýÆ÷£¬Ëü±»ÓÃÀ´¿ØÖƶԹ«¹²×ÊÔ´µÄ·ÃÎÊ¡£Ëü¿ÉÒÔ±»Ôö¼Ó»ò¼õÉÙ£¬µ«¶ÔÆäµÄ¹Ø¼ü·ÃÎʱ»±£Ö¤ÊÇÔ­×Ó²Ù×÷¡£Èç¹ûÒ»¸ö³ÌÐòÖÐÓжà¸öÏß³ÌÊÔͼ¸Ä±äÒ»¸öÐźÅÁ¿µÄÖµ£¬ÏµÍ³½«±£Ö¤ËùÓеIJÙ×÷¶¼½«ÒÀ´Î½øÐС£

Ðŵ÷Óú¯Êýsem_post£¨£©Ôö¼ÓÐźÅÁ¿¡£Ö»Óе±ÐźÅÁ¿Öµ´óÓÚ£°Ê±£¬²ÅÄÜʹÓù«¹²×ÊÔ´£¬Ê¹Óú󣬺¯Êýsem_wait£¨£©¼õÉÙÐźÅÁ¿¡£

ÀÏ¹æ¾Ø£¬ÏÈÉÏ´úÂ룬ÅÜÆðÀ´ÔÙ˵£º

#include <iostream>
#include <semaphore.h>
#include <string.h>
#include <stdio.h>
using namespace std;
//ÐźÅÁ¿
sem_t sem;
void * run(void *ptr){
char *buf=(char *)ptr;
while(strcmp("exit\n",buf)!=0) {
//кÅÁ¿-1
sem_wait(&sem);
cout<<"thread output>> "<<buf<<endl<<flush;
}
return 0;
}
int main(){
char buf[100]={0};
int ret=0;
pthread_t id;
//³õʼ»¯ÐźÅÁ¿ÊýÁ¿Îª2¡£Ä¬ÈÏÀàÐÍ£¬·Ç0λ½ø³Ì¼ä¹²Ïí
ret=sem_init(&sem, 0, 2);
if(ret) {
cout<<"sem_init failed"<<endl;
}
pthread_create(&id,NULL,run,buf);
//Ñ­»·´Ó±ê×¼ÊäÈë¶Á£¨fgets»á½«\nÒ²¶ÁÈ룩
while(fgets(buf,sizeof(buf),stdin)) {
if(strcmp("exit\n",buf)==0) {
break;
}
//ÐźÅÁ¿+1
sem_post(&sem);
}
//ÇåÀíÐźÅÁ¿
sem_destroy(&sem);
return 0;
}

º¯Êýsem_trywait£¨£©ºÍº¯Êýpthread_ mutex_trylock£¨£©ÆðͬÑùµÄ×÷Óã¬ËüÊǺ¯Êýsem_wait£¨£©µÄ·Ç×èÈû°æ±¾¡£ÏÂÃæÎÒÃÇÖð¸ö½éÉܺÍÐźÅÁ¿ÓйصÄһЩº¯Êý£¬ËüÃǶ¼ÔÚÍ·Îļþ/usr/include/semaphore.hÖж¨Òå¡£

#include <sys/cdefs.h>
__BEGIN_DECLS
typedef struct {
volatile unsigned int count;
} sem_t;
#define SEM_FAILED NULL
extern int sem_init(sem_t *sem, int pshared, unsigned int value);
extern int sem_close(sem_t *);
extern int sem_destroy(sem_t *);
extern int sem_getvalue(sem_t *, int *);
extern int sem_init(sem_t *, int, unsigned int);
extern sem_t *sem_open(const char *, int, ...);
extern int sem_post(sem_t *);
extern int sem_trywait(sem_t *);
extern int sem_unlink(const char *);
extern int sem_wait(sem_t *);
struct timespec;
extern int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

½á¹û£º

[root@localhost threadDemo]# ./fourth
thread output>>
thread output>>
hello
thread output>> hello
come on baby
thread output>> come on baby
exit

ÕâÀïÐèÒªÒýÈëеÄÍ·Îļþsemaphore.h

sem_init

³õʼ»¯ÐźÅÁ¿¡£¸Ãº¯Êý³õʼ»¯ÓÉsemÖ¸ÏòµÄÐźŶÔÏó£¬ÉèÖÃËüµÄ¹²ÏíÑ¡Ï²¢¸øËüÒ»¸ö³õʼµÄÕûÊýÖµ¡£pshared¿ØÖÆÐźÅÁ¿µÄÀàÐÍ£¬Èç¹ûÆäֵΪ0£¬¾Í±íʾÕâ¸öÐźÅÁ¿Êǵ±Ç°½ø³ÌµÄ¾Ö²¿ÐźÅÁ¿£¬·ñÔòÐźÅÁ¿¾Í¿ÉÒÔÔÚ¶à¸ö½ø³ÌÖ®¼ä¹²Ïí£¬valueΪsemµÄ³õʼֵ¡£µ÷Óóɹ¦Ê±·µ»Ø0£¬Ê§°Ü·µ»Ø-1.

sem_post ( sem_t *sem )

¸Ãº¯ÊýÓÃÓÚÒÔÔ­×Ó²Ù×÷µÄ·½Ê½½«ÐźÅÁ¿µÄÖµ¼Ó1¡£µ±ÓÐÏß³Ì×èÈûÔÚÕâ¸öÐźÅÁ¿ÉÏʱ£¬µ÷ÓÃÕâ¸öº¯Êý»áʹÆäÖеÄÒ»¸öÏ̲߳»ÔÚ×èÈû£¬Ñ¡Ôñ»úÖÆÍ¬ÑùÊÇÓÉÏ̵߳ĵ÷¶È²ßÂÔ¾ö¶¨µÄ¡£

sem_wait( sem_t *sem )

±»ÓÃÀ´×èÈûµ±Ç°Ïß³ÌÖ±µ½ÐźÅÁ¿semµÄÖµ´óÓÚ0£¬½â³ý×èÈûºó½«semµÄÖµ¼õ1£¬±íÃ÷¹«¹²×ÊÔ´¾­Ê¹Óúó¼õÉÙ¡£

sem_destroy

¸Ãº¯ÊýÓÃÓÚ¶ÔÓÃÍêµÄÐźÅÁ¿µÄÇåÀí

semaphore.hÍ·Îļþ

#ifndef _SEMAPHORE_H
#define _SEMAPHORE_H 1
#include <features.h>
#include <sys/types.h>
#ifdef __USE_XOPEN2K
# define __need_timespec
# include <time.h>
#endif
/* Get the definition for sem_t. */
#include <bits/semaphore.h>

__BEGIN_DECLS
/* Initialize semaphore object SEM to VALUE. If PSHARED then share it
with other processes. */
extern int sem_init (sem_t *__sem, int __pshared, unsigned int __value)
__THROW;
/* Free resources associated with semaphore object SEM. */
extern int sem_destroy (sem_t *__sem) __THROW;
/* Open a named semaphore NAME with open flags OFLAG. */
extern sem_t *sem_open (__const char *__name, int __oflag, ...) __THROW;
/* Close descriptor for named semaphore SEM. */
extern int sem_close (sem_t *__sem) __THROW;
/* Remove named semaphore NAME. */
extern int sem_unlink (__const char *__name) __THROW;
/* Wait for SEM being posted.
This function is a cancellatio point and therefore not marked with
__THROW. */
extern int sem_wait (sem_t *__sem);
#ifdef __USE_XOPEN2K
/* Similar to `sem_wait' but wait only until ABSTIME.
This function is a cancellatio point and therefore not marked with
__THROW. */
extern int sem_timedwait (sem_t *__restrict __sem,
__const struct timespec *__restrict __abstime);
#endif
/* Test whether SEM is posted. */
extern int sem_trywait (sem_t *__sem) __THROW;
/* Post SEM. */
extern int sem_post (sem_t *__sem) __THROW;
/* Get current value of SEM and store it in *SVAL. */
extern int sem_getvalue (sem_t *__restrict __sem, int *__restrict __sval)
__THROW;

__END_DECLS
#endif /* semaphore.h */

 

 

 
   
8584 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÔÆ¼ÆËãµÄ¼Ü¹¹
¶ÔÔÆ¼ÆËã·þÎñÄ£ÐÍ
ÔÆ¼ÆËãºËÐļ¼ÊõÆÊÎö
Á˽âÔÆ¼ÆËãµÄ©¶´
 
Ïà¹ØÎĵµ

ÔÆ¼ÆËã¼ò½é
ÔÆ¼ÆËã¼ò½éÓëÔÆ°²È«
ÏÂÒ»´úÍøÂç¼ÆËã--ÔÆ¼ÆËã
ÈídzÎöÔÆ¼ÆËã
 
Ïà¹Ø¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
ÔÆ¼ÆËãÓ¦ÓÃÓ뿪·¢
CMMIÌåϵÓëʵ¼ù
»ùÓÚCMMI±ê×¼µÄÈí¼þÖÊÁ¿±£Ö¤
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]
 
×îÐÂÎÄÕÂ
»ùÓÚFPGAµÄÒì¹¹¼ÆËãÔÚ¶àýÌåÖеÄÓ¦ÓÃ
ÉîÈëLinuxÄں˼ܹ¹¡ª¡ª¼ò½éÓë¸ÅÊö
LinuxÄÚºËϵͳ¼Ü¹¹½éÉÜ
dzÎöǶÈëʽCÓÅ»¯¼¼ÇÉ
½ø³Ì¼äͨÐÅ£¨IPC£©½éÉÜ
×îпγÌ
ǶÈëʽLinuxÇý¶¯¿ª·¢
´úÂëÕû½àÖ®µÀ-̬¶È¡¢¼¼ÒÕÓëϰ¹ß
ǶÈëʽÈí¼þ²âÊÔ
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
ǶÈëʽÈí¼þ¿É¿¿ÐÔÉè¼Æ
³É¹¦°¸Àý
ij¾ü¹¤Ëù ǶÈëʽÈí¼þ¼Ü¹¹
Öк½¹¤ÒµÄ³Ñо¿Ëù ǶÈëʽÈí¼þ¿ª·¢Ö¸ÄÏ
ij¹ìµÀ½»Í¨ ǶÈëʽÈí¼þ¸ß¼¶Éè¼ÆÊµ¼ù
ÉîÛÚ Ç¶ÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
ijÆóÒµ »ùÓÚIPDµÄǶÈëʽÈí¼þ¿ª·¢