zoukankan      html  css  js  c++  java
  • linux 多线程的分离和可链接属性

    #include "common.h"
    
    /**
    
    这种情况一般用于某个多线程调用的模块使用前的初始化,但是无法判定哪个线程先运行,从而不知道把初始化代码放在哪个线程合适的问题。 
    当然,我们一般的做法是把初始化函数放在main里,创建线程之前来完成,但是如果我们的程序最终不是做成可执行程序,而是编译成库的形式,那么main函数这种方式就没法做到了。
    
    **/
    
    static pthread_t  thread_miccapture;
    static pthread_t  thread_audioplay;
    static int pthread_run = 0;
    static pthread_t  thread_main;
    static char* pusb_confi ;
    static float i2c_buf = 0;
    static sem_t mysem;
    
    static  int mtd_size[]  = { 0x00001000,0x00001000,0x00002000,0x00002000,0x00000c00,0x00002000,0x00000800  };
    
    
    typedef  struct  mutex_lock_tag      // 后面加tag 
    {
    	pthread_mutex_t  mutex;
    	int data;
    }mutex_lock_t;    // 后面加_t 
    
    //int pthread_once(pthread_once_t *once_control, void (*init_routine) (void));
    
    static pthread_once_t pthread_onces = PTHREAD_ONCE_INIT; 
    static mutex_lock_t*  pdata = NULL;
    static void * mic_capture_thread(void *arg);
    static void * audio_play_thread(void *arg);
    static clock_t  mic_start  = 0;
    static clock_t  audio_play_start = 0;
    static double time_offset;
    static unsigned  int data = 1;
    
    //static void  prints(unsigned   int data)
    static void  pthread_init(void)  
    {
    	printf("pthread_once init
    ");
    	int ret = sem_init(&mysem,0,1);
    	printf("ret is %d
    ",ret);
    	ret = pthread_mutex_init(&pdata->mutex,NULL); // 添加初始化锁
    	sleep(3);
    	printf("delay delay
    ");  // 完成一些需要延时的功能初始化操作
    	printf("1111122222221
    ");
    	
    }
    static  void  prints(void)
    {
    	sem_wait(&mysem);
    	if(data<=100)
    	{   
    		printf("data is %u
    ",data);
    	}
    	else
    	{
    		data = 1;
    	}
    	sem_post(&mysem);
    }
    
    static void * mic_capture_thread(void *arg)
    {
    	int ret = -1; 
    	ret = pthread_equal(thread_main,thread_miccapture);
    	if(ret > 0)
    	{	
    		printf("two the same thread
    ");
    	}
    	else 
    	{
            printf("diff in two thread
    ");
    	}
    	//ret = pthread_once(&pthread_onces,pthread_init);
    	printf("ret is %d
    ",ret);
    	while(pthread_run)
    	{
    		//printf("mic capture thread
    ");
    		//ret = pthread_mutex_lock(&pdata->mutex);
    		pdata->data  =  10;
    		data++;
    		prints();
    		//ret = pthread_mutex_unlock(&pdata->mutex);	
    		//mic_start = clock();
    		//usleep(100000);
    		
    	}
    
    }
    
    static void * audio_play_thread(void *arg)
    {
    	int read_status = 1; 
    	int ret = 0;
    	//ret = pthread_once(&pthread_onces,pthread_init);
    	printf("ret is %d
    ",ret);
    	while(pthread_run)
    	{
    	  
    	 //  if(read_status)
    	   {
    			
    			//if(ret)
    			{
    			
    				//ret = pthread_mutex_lock(&pdata->mutex);
    				//pdata->data = 11;
    				//printf("data.data is %d ret is %d
    ",pdata->data,ret);
    				data++;
    				prints();
    				//ret = pthread_mutex_unlock(&pdata->mutex);
    				//usleep(100000);
    				//audio_play_start = clock();
    				//time_offset = (double)(audio_play_start - mic_start)/CLOCKS_PER_SEC;
    				//printf("time_offset  is %f
    ",time_offset);
    				
    			}
    			
    	   }
    	
    	}
    	
    }
    
    
    static int compare(const void* dataA,const void*dataB)
    {
    
      return 0;
    }
    
    void task_create(void)
    {
        char* tmp[10] = { 0};
    	int ret = -1;
    	pthread_run = 1;
    	double  totol = 0;
    	int i = 0;
    	pthread_attr_t mic_attr;
    	pthread_attr_t play_attr;
    	int pthread_att;
    	int data[] = {10,200,400,600,700,200};
    	pdata = malloc(sizeof(mutex_lock_t));
    	if(pdata == NULL)
    	{
    		printf("pdata is error
    ");
    	}
    	
    	while(i<sizeof(mtd_size)/sizeof(mtd_size[0]))
    	{
    		totol = mtd_size[i++]+totol;  
    	}
    
    	/**
    	
    		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 detachstate);
    		int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);	
    		
    	**/
    	
    		ret = pthread_attr_init(&mic_attr);
    		printf("ret is %d
    ",ret);
    	{
    		ret = pthread_attr_setdetachstate(&mic_attr,PTHREAD_CREATE_DETACHED);
    		printf("ret is %d
    ",ret);
    		ret = pthread_create(&thread_miccapture,
    								&mic_attr, // 第二个参数  设置不要是NULL 
    								mic_capture_thread,
    								NULL);
    		if(ret<0)
    		{
    	       perror("pthread_create failure
    ");
    		   return ;
    		}
    		
    	    pthread_attr_getdetachstate(&mic_attr,&pthread_att);
    		printf("PTHREAD_CREATE_DETACHED is %d  PTHREAD_CREATE_JOINABLE is %d mic pthread_att is is ######%d
    ",PTHREAD_CREATE_DETACHED,PTHREAD_CREATE_JOINABLE,pthread_att);
    		
    		pthread_attr_getdetachstate(&play_attr,&pthread_att);
    		printf("play_attr pthread_att is is ######%d
    ",pthread_att);
    	    
    		ret = pthread_attr_init(&play_attr);
    		printf("ret is %d
    ",ret);
    		ret = pthread_attr_setdetachstate(&play_attr,PTHREAD_CREATE_JOINABLE);
    		printf("ret is %d
    ",ret);
    		
    		#if 1
    	  	ret = pthread_create(&thread_audioplay,
    	  						&play_attr, // 第二个参数 设置不要是NULL 
    	  						audio_play_thread,
    	  						NULL);
    		if(ret<0)
    		{
    	       perror("pthread_create failure
    ");
    		   return ;
    		}
    		#endif
    
    		
    		pthread_run = 0;// 两个线程退出  
    		ret = pthread_once(&pthread_onces,pthread_init);
    		printf("ret is %d
    ",ret);
    		printf("PTHREAD_ONCE_INIT is %d
    ",PTHREAD_ONCE_INIT);
    		ret = pthread_join(thread_miccapture,NULL);
    		printf("thread_miccapture join is %d
    ",ret);
      		ret = pthread_join(thread_audioplay,NULL);
    		printf("thread_audioplay join is %d
    ",ret);
    		pthread_mutex_destroy(&pdata->mutex);
    		sem_destroy(&mysem);
    		pthread_attr_destroy(&mic_attr);  // 销毁线程分离|可join属性
    		pthread_attr_destroy(&play_attr); // 销毁线程分离|可join属性
    		free(pdata);
    		printf("pthread here
    ");
    		
    		
    	}
    		
    }
    

      

    一勤天下无难事。
  • 相关阅读:
    关于爬虫中常见的两个网页解析工具的分析 —— lxml / xpath 与 bs4 / BeautifulSoup
    纯手工打造简单分布式爬虫(Python)
    原创python:windows解决genymotion appium adb 的问题。
    安装appium桌面版和命令行版
    Appium+Python 自动化appium常用元素定位方法
    python selenium 对浏览器标签页进行关闭和切换
    安装scrapy框架出错的解决
    PyCharm的基本快捷键和配置简介
    python正则表达式详解
    Python多进程库multiprocessing中进程池Pool类的使用
  • 原文地址:https://www.cnblogs.com/nowroot/p/13606500.html
Copyright © 2011-2022 走看看