简单线程池类

简单练习了一下代码,简单实现了一下线程池类,增加对线程的理解和掌控。以后有时间再好好完善下,现在和大家分享下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <math.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <pthread.h>
#include <assert.h>
#include <vector>
#include<iostream>

using namespace std;

typedef struct worker
{
    void* (*process)(void* arg);
	void* arg;
	pthread_t threadid;

} worker_thread;



typedef vector<worker_thread>::iterator TASK_ITERTOR;

class ThreadPool
{
public:
  ThreadPool(void);
  ~ThreadPool(void);


  static ThreadPool& Instance(){static ThreadPool single; return single;}

  bool Init(int number);

  bool add(void *(*process) (void *arg), void *arg);

  bool clear();

  bool GetTask(int index);

  void *thread_run();
  ///方法成员
public:
  
  ///数据成员
private:

   pthread_mutex_t m_lock;     //线程锁
   pthread_cond_t  m_ready;   //条件变量
   vector<worker_thread> m_threadPool; //线程容器
   int isDestory;       //是否销毁
   int m_max_thread_num; //活动的最大现场数

   int cur_thread_index; //当前现场的索引

   pthread_t* threadid;

   TASK_ITERTOR m_iter;
};



static void *run(void *arg)
{
    ThreadPool* p = (ThreadPool*)arg;

	p->thread_run();

}


ThreadPool::ThreadPool(void)
{
   m_max_thread_num = 0;
   cur_thread_index = 0;
   isDestory = 0;
}

ThreadPool::~ThreadPool()
{

}

bool ThreadPool::Init(int number)
{

   m_max_thread_num = number;

   pthread_mutex_init(&m_lock,NULL);
   pthread_cond_init(&m_ready,NULL);

   cur_thread_index = 0;

   threadid = new pthread_t[number];
 
   for (int thread_loop = 0;thread_loop < number;thread_loop++)
   {
       //printf("initital,create thread no.=%0x\n",threadid[thread_loop]);
       pthread_create(&threadid[thread_loop],NULL,run,(void*)(this));
   }

   
   return true;

}

bool ThreadPool::GetTask(int index)
{   
     m_iter  = m_threadPool.begin();
     for (int i = 0;i< index;i++)
     {
        m_iter++;
     }
}

bool ThreadPool::add(void *(* process)(void * arg),void * arg)
{
   worker_thread work;

   work.arg = arg;
   work.process = process;

   pthread_mutex_lock(&m_lock);

   m_threadPool.push_back(work);

   //ThreadPool::Instance().GetHead(cur_thread_index);
   cur_thread_index++;
  
   pthread_mutex_unlock(&m_lock);

   pthread_cond_signal(&m_ready);

   //printf("task size=%d\n",m_threadPool.size());
   return true;
}


bool ThreadPool::clear()
{
   if (isDestory)
   {
       return true;
   }

   isDestory = 1;

   pthread_cond_broadcast(&m_ready);

   for (int i = 0; i < m_max_thread_num; i++)
         pthread_join (threadid[i], NULL);
	
   delete []threadid;

   pthread_mutex_destroy(&m_lock);
   pthread_cond_destroy(&m_ready);

   m_threadPool.clear();
}

void * ThreadPool::thread_run()
{
   
   printf("%0x thread is startting\n",pthread_self());

  
   int li_loop = 0;
   
   while(1)
   {
       pthread_mutex_lock(&m_lock);
	   //int* cur_index = (int*)arg;
	   //printf("cur_thread_index=%d\n",cur_thread_index);
	   while(cur_thread_index== 0 && !isDestory)
	   {
	        printf ("thread %0x is waiting\n", pthread_self ());
	        pthread_cond_wait(&m_ready, &m_lock);
	   }

	    if (isDestory)
	   {
		  
		   pthread_mutex_unlock (&m_lock);
		   printf ("thread %0x will exit\n", pthread_self ());
		   pthread_exit (NULL);
	   }
		

	   printf ("thread %0x is starting to work\n", pthread_self ());

	  
	   cur_thread_index--;

		 
		 worker_thread* work =&(*m_iter);

		 if (work != NULL)
		 {
	         (*(work->process))(m_iter->arg);

			 m_iter++;
		 }

		

	/* for (;iter != m_threadPool.end();++iter)
	 {
		 worker_thread* work =&(*iter);

		 (*(work->process))(iter->arg);

		 li_loop++;

		 if (li_loop == m_max_thread_num)
		 {
              li_loop = 0;
			  
		 }
	 } */
      
		 
		 pthread_mutex_unlock(&m_lock);

		 
		 

   	}

  
}

void * task_run (void *arg)
{    
     int* task_no = (int*)(arg);
     printf (" task %d is on working that threadid is %0x,\n", *task_no,pthread_self ());
     sleep (2);/*休息一秒,延长任务的执行时间*/
    return NULL;
}


char *GetCurrentTime(char *azp_CurrentTime)
{
  time_t lt_now_time;
  struct tm *local_time;
  time(<_now_time);
  local_time=localtime(<_now_time);

  sprintf(azp_CurrentTime,"%d-%02d-%02d %02d:%02d:%02d",local_time->tm_year+1900,
    local_time->tm_mon+1,local_time->tm_mday,local_time->tm_hour,local_time->tm_min,local_time->tm_sec);
  return(azp_CurrentTime);
}


int DateTimeCmp(char *azp_DateTime1,    /*时间1*/
                char *azp_DateTime2,    /*时间2*/
                long *alp_Duration      /*结果整形指针*/
         )
{
  struct tm ls_DateTime1,ls_DateTime2;
  time_t    lt_DateTime1,lt_DateTime2;
  long    ll_Duration;

  memset((void *) &ls_DateTime1, 0, sizeof(struct tm));
  memset((void *) &ls_DateTime2, 0, sizeof(struct tm));

  /*转换为tm结构变量*/
  strptime( azp_DateTime1,"%Y-%m-%d %T", &ls_DateTime1 );
  strptime( azp_DateTime2,"%Y-%m-%d %T", &ls_DateTime2 );

  /*将结果转换为字串*/
  if  (( lt_DateTime1 = mktime( &ls_DateTime1 )) == (time_t)-1 )
  {
    return( -1 );
  }
  if  (( lt_DateTime2 = mktime( &ls_DateTime2 )) == (time_t)-1 )
  {
    return( -1 );
  }
  
  /*将比较结果写入目标缓冲*/
  *alp_Duration = (long)difftime( lt_DateTime1,lt_DateTime2 );
  
  return( 0 );
}


int main()
{

    char curtime[20]={0};
	char lasttime[20]={0};
	long li_dur = 0;
	ThreadPool::Instance().Init(3);
   
    int i;

	int *workingnum = (int *) malloc (sizeof (int) * 10);

	GetCurrentTime(curtime);
	//printf("curtime=%s\n",curtime);
	while(1)
	{   
	    GetCurrentTime(lasttime);

		
		DateTimeCmp(lasttime,curtime,&li_dur);

		//printf("li_dur=%d\n",li_dur);
		if (li_dur > 10)
		{
			for (i = 0; i < 10; i++)
			{
				workingnum[i] = i;
				ThreadPool::Instance().add(task_run, &workingnum[i]); 
				ThreadPool::Instance().GetTask(i);
		        sleep(1);	
			}

			strcpy(curtime,lasttime);
		}
	}

	

    /*等待所有任务完成*/
     sleep (10);
    /*销毁线程池*/
     //ThreadPool::Instance().clear();


     free (workingnum);
    return 0;

}

在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
封装一个Android线程池是一个常见的编程实践,用于管理一组工作线程。Android中的线程池可以帮助我们控制并发度、减少资源消耗以及提高任务的执行效率。下面是封装一个简单的Android线程池的基本步骤和示例代码: 1. 创建一个并使用`ThreadPoolExecutor`来实现线程池的管理。 2. 提供方法来提交任务到线程池。 3. 可以定义一些参数来控制线程池的行为,如核心线程数、最大线程数、存活时间、任务队列、线程工厂等。 示例代码: ```java import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class MyThreadPool { // 线程池实例 private ThreadPoolExecutor mThreadPoolExecutor; // 构造函数,初始化线程池 public MyThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) { mThreadPoolExecutor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory); } // 提交任务到线程池 public void execute(Runnable task) { mThreadPoolExecutor.execute(task); } // 可以添加更多管理线程池的方法,如关闭线程池、获取线程池状态等。 } ``` 使用自定义线程池时,你可以这样使用: ```java MyThreadPool myThreadPool = new MyThreadPool( 5, // 核心线程数 10, // 最大线程数 30, // 非核心线程存活时间 TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(50), // 任务队列 Executors.defaultThreadFactory() // 默认线程工厂 ); // 提交任务 myThreadPool.execute(new Runnable() { @Override public void run() { // 你的任务代码 } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值