阿斯顿发生地方
2015-10-20 23:34
281 查看
#include <unistd.h> #include <cstdio> #include <dirent.h> #include <sys/stat.h> #include <sys/time.h> #include <iostream> #include <deque> #include <list> #include <pthread.h> using namespace std; bool g_bIsListDirEnd = false; pthread_mutex_t g_mutex; void FormatDir(string& strDir) { if (strDir.at(strDir.length() -1) != '\\' && strDir.at(strDir.length() -1) != '/') { strDir += '/'; } } void* thrd_func(void *arg) { list<string>* pList = (list<string>*)arg; if (!arg) { cout << "arg is null" << endl; pthread_exit((void *)1); } int nCount = 0; while(true) { string strFileName; pthread_mutex_lock(&g_mutex); if (pList->size() > 0) { strFileName = pList->front(); pList->pop_front(); ++nCount; } pthread_mutex_unlock(&g_mutex); if (!strFileName.empty()) { usleep(10000); if (nCount % 1000 == 0) { cout << strFileName << " " << nCount << endl; } } else { usleep(1); } pthread_mutex_lock(&g_mutex); int nSize = pList->size(); pthread_mutex_unlock(&g_mutex); if (g_bIsListDirEnd && nSize == 0) { break; } } cout << "thread deals total files:" << nCount << endl; } void ListDir(const string& strTopDir) { deque<string> deqDirs; deqDirs.push_back(strTopDir); list<string> listFiles; const int nThreadNum = 4; pthread_t tid[nThreadNum]; for(int i = 0; i < nThreadNum; ++i) { if (pthread_create(&tid[i], NULL, thrd_func, &listFiles) != 0) { cout << "create thread failed:" << i << endl; return; } } int nCountDirs = 0; int nCountFiles = 0; while(deqDirs.size() > 0) { string strDir = deqDirs.front(); deqDirs.pop_front(); if (strDir.empty()) { continue; } DIR *dir; if(!(dir = opendir(strDir.c_str()))) { cout << "open dir failed:" << strDir << endl; continue; } FormatDir(strDir); struct dirent *file; while((file = readdir(dir)) != NULL) { if (file->d_name[0] == '.') { continue; } string strFullPath = strDir + file->d_name; struct stat stFile; if(stat(strFullPath.c_str(), &stFile) >= 0 && S_ISDIR(stFile.st_mode)) { if (strFullPath.find("/proc") == string::npos && strFullPath.find("/sys") == string::npos && strFullPath.find("/dev") == string::npos) { deqDirs.push_back(strFullPath); ++nCountDirs; } } else { while(true) { pthread_mutex_lock(&g_mutex); int nSize = listFiles.size(); pthread_mutex_unlock(&g_mutex); if (nSize < 5000) { break; } cout << "wait files dealed" << endl; usleep(1000000); } pthread_mutex_lock(&g_mutex); listFiles.push_back(strFullPath); pthread_mutex_unlock(&g_mutex); ++nCountFiles; } } closedir(dir); } cout << "list dir end" << endl; g_bIsListDirEnd = true; for(int i = 0; i < nThreadNum; ++i) { void *tret; pthread_join(tid[i],&tret); } cout << "dirs:" << nCountDirs << " files:" << nCountFiles << " total:" << nCountDirs + nCountFiles << endl; } int main(int argc, char* argv[]) { if (argc != 2) { printf("argc error!\n"); return -1; } pthread_mutex_init(&g_mutex,NULL); struct timeval tv1; gettimeofday(&tv1, NULL); ListDir(argv[1]); struct timeval tv2; gettimeofday(&tv2, NULL); cout << "cost time:" << (tv2.tv_sec - tv1.tv_sec)*1000 + (tv2.tv_usec - tv1.tv_usec)/1000 << "ms" << endl; pthread_mutex_destroy(&g_mutex); return 0; }
相关文章推荐
- js 遮罩层 loading 效果
- Sql Server来龙去脉系列之一 目录篇
- 利用函数调用,对数组进行初始化,更改,清零,逆置等操作
- HDU 1466 DP
- MyBatis(1)框架原理
- POJ - 3264 Balanced Lineup(线段树)
- php 匹配字符串中的连续数字
- 单链表的Java实现
- 云计算服务模型,第 1 部分: 基础架构即服务(IaaS)
- 自定义LinkedList
- Java IO8:IO简单总结
- 技术小故事-Activity的Launch Mode引起的动画“疑案”
- Eclipse与Mysql驱动连接的问题
- Android空数据页面提示控件
- Android 新特性 - TabLayout
- HDOJ 动态规划总结
- Unity中欧拉角与四元数的文档整理(旋转)
- 使用构造代码块精炼程序
- ZOJ - 1610 Count the Colors(线段树)
- 谷歌搜索语法