多线程处理数据

1.多线程多文件处理

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include <memory.h>
#include <process.h>
#include <Windows.h>
//多线程多文件,实现线程的调度,设计模式,
//释放内存
//内存不够的情况,排队完成任务

struct infos
{
    char path[256];//原始
    int id;

    char **g_pp;//吧文件的内容,载入这个地址
    int length;

    char findstr[100];//查询

}myinfo[22] = {0};//22个结构体保存了22个文件的信息
HANDLE inithd[22] = {0};//22个初始化线程地址
HANDLE findhd[22] = { 0 };//22个查找线程地址

void runthreadinit(void *p)
{
    struct infos *pinfo = p;
    FILE *pf = fopen(pinfo->path, "r");
    if (pf!=NULL)
    {
        int i = 0;//测试多少行
        while (!feof(pf))
        {
            char str[256] = { 0 };
            fgets(str, 256, pf);//读取
            i++;
        }
        //i记录行数
        rewind(pf);//回到开头 fseek(pf,0,SEEK_SET);
        pinfo->g_pp = calloc(i, sizeof(char*));//分配内存初始化
        pinfo->length = i;//记录长度
        for (int j = 0; j < i;j++)
        {
            char str[256] = { 0 };
            fgets(str, 256, pf);//读取
            int length = strlen(str);
            pinfo->g_pp[j] = calloc(length + 1, sizeof(char));//分配内存
            if (pinfo->g_pp[j]!=NULL)
            {
                strcpy(pinfo->g_pp[j], str);//拷贝内存
            }

        }

    }
    fclose(pf);
    printf("线程%d init  over\n", pinfo->id);
}
void runthreadsearch(void *p)
{
    struct infos *pinfo = p;
    for (int i = 0; i < pinfo->length;i++)
    {
        if (pinfo->g_pp[i]!=NULL)
        {
            char *px = strstr(pinfo->g_pp[i], pinfo->findstr);
            if (px!=NULL)
            {
                printf("\n%s", pinfo->g_pp[i]);
            }
        }
    }

    printf("线程%d find over\n", pinfo->id);

}

void freeall(struct infos *pinfo)
{
    printf("freeall   start");
    for (int i = 0; i < pinfo->length;i++)
    {
        free(pinfo->g_pp[i]);//释放指针数组每一个指针对于的内存
    }
    free(pinfo->g_pp);//释放

    printf("freeall   end;");

}

void main()
{
    for (int i = 0; i < 22;i++)
    {
        myinfo[i].id = i+1;
        sprintf(myinfo[i].path, "Z:\\I\\尹成清华终极版C语言视频源码文档20150131\\大数据相关数据\\dangdangwang%d.txt", i + 1);
        strcpy(myinfo[i].findstr, "吴伟");
    }

    for (int i = 0; i < 15;i++)
    {
         inithd[i] = _beginthread(runthreadinit, 0, &myinfo[i]);
    }
    WaitForMultipleObjects(15, inithd, TRUE, INFINITE);//等待
    system("pause");
    for (int i = 0; i < 15;i++)
    {
        findhd[i] = _beginthread(runthreadsearch, 0, &myinfo[i]);
    }
    WaitForMultipleObjects(15, findhd, TRUE, INFINITE);//等待
    system("pause");
    printf("开始释放");
    for (int i = 0; i < 15;i++)
    {
        freeall(&myinfo[i]);
    }
    printf("结束释放");
    system("pause");

    for (int i = 15; i < 22; i++)
    {
        inithd[i] = _beginthread(runthreadinit, 0, &myinfo[i]);
    }
    WaitForMultipleObjects(7, inithd+15, TRUE, INFINITE);//等待
    system("pause");

    system("pause");
    for (int i = 15; i < 22; i++)
    {
        findhd[i] = _beginthread(runthreadsearch, 0, &myinfo[i]);
    }
    WaitForMultipleObjects(7, findhd+15, TRUE, INFINITE);//等待
    system("pause");

    for (int i = 7; i < 22; i++)
    {
        freeall(&myinfo[i]);
    }
    system("pause");
}

void main1x()
{

    //myinfo[0].id = 1;
    //strcpy(myinfo[0].path, "Z:\\I\\尹成清华终极版C语言视频源码文档20150131\\大数据相关数据\\dangdangwang1.txt");
    //HANDLE pd1 = _beginthread(ru
//#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//#include<stdlib.h>
//#include <string.h>
//#include <memory.h>
//#include <process.h>
//#include <Windows.h>
//
//char *path = "Z:\\I\\尹成清华终极版C语言视频源码文档20150131\\大数据相关数据\\dangdangwang.txt";
//#define N 13180820
//char ** g_pp;
//struct threads *pthread;
//
//void  init(char *path)
//{
//
//    printf("init start");
//    g_pp = malloc(sizeof(char*)*N);
//    memset(g_pp, ‘\0‘, sizeof(char*)*N);//清空内容
//    FILE *pf = fopen(path, "r");
//
//    if (pf==NULL)
//    {
//        printf("init  fail");
//    }
//    else
//    {
//        for (int i = 0; i < N;i++)
//        {
//            char str[1024] = { 0 };
//            fgets(str, 1024, pf);//读取字符串
//            int length = strlen(str);//获取长度
//            if (length >= 1)
//            {
//                g_pp[i] = malloc(sizeof(char)*(length + 1));//分配内存
//                memset(g_pp[i], ‘\0‘, length + 1);//清空内容
//                if (g_pp[i]!=NULL)
//                {
//                    strcpy(g_pp[i], str);//拷贝
//                }
//
//
//            }
//
//
//
//        }
//
//
//
//
//
//        fclose(pf);
//    }
//
//    printf("init end");
//
//}
//
//void  search(char*str)
//{
//
//    for (int i = 0; i < N;i++)
//    {
//        if (g_pp[i]!=NULL)
//        {
//            char *p = strstr(g_pp[i], str);
//            if (p != NULL)
//            {
//                printf("%s\n", g_pp[i]);//找到打印
//            }
//        }
//
//    }
//
//
//}
//
//
//struct threads
//{
//    char **ppstart;//指针数组的起始地址
//    int length;
//    int id;
//    char *pstr;//查找的字符串
//
//};
//void searchthread(void *p)
//{
//    struct threads *pinfo = p;
//    for (int i = 0; i < pinfo->length;i++)
//    {
//        if (pinfo->ppstart[i]!=NULL)
//        {
//            char *p = strstr(pinfo->ppstart[i], pinfo->pstr);//查找
//            if (p!=NULL)
//            {
//                printf("线程%d找到%s\n", pinfo->id,pinfo->ppstart[i]);//找到
//            }
//        }
//    }
//
//
//
//
//
//}
//
//void  searchwiththread(char*str)
//{
//    int num = 23;//线程是CPU核心的倍数
//    pthread = malloc(sizeof(struct threads) * 23);//堆上开辟
//    memset(pthread, ‘\0‘, sizeof(struct threads )* 23);
//    HANDLE *phd = malloc(sizeof(HANDLE) * 23);
//
//    //
//    if (N%num==0)
//    {
//
//        for (int i = 0; i < num;i++)
//        {
//            pthread[i].id = i;
//            pthread[i].pstr = str;
//            pthread[i].length = N/num;//100  5
//            pthread[i].ppstart = g_pp+i*(N/num);//起始地址
//            phd[i] = _beginthread(searchthread, 0, &pthread[i]);//创建线程
//
//        }
//
//    }
//    else
//    {
//        //100 9  8×12+4
//        for (int i = 0; i < num-1; i++)
//        {
//            pthread[i].id = i;
//            pthread[i].pstr = str;
//            pthread[i].length = N / (num-1);//100  5
//            pthread[i].ppstart = g_pp + i*(N / (num-1));//起始地址
//            phd[i] = _beginthread(searchthread, 0, &pthread[i]);//创建线程
//
//        }
//        {
//            int i = num - 1;
//            pthread[i].id = i;
//            pthread[i].pstr = str;
//            pthread[i].length = N%(num-1);//100  5
//            pthread[i].ppstart = g_pp + i*(N / (num - 1));//起始地址
//            phd[i] = _beginthread(searchthread, 0, &pthread[i]);//创建线程
//            //0 8*12
//        }
//
//
//    }
//
//    WaitForMultipleObjects(num, phd, TRUE, INFINITE);//等待所有线程退出
//
//
//}
//
//
//
//
//
//int getN(char *path)
//{
//    FILE *pf = fopen(path, "r");
//    if (pf == NULL)
//    {
//        return -1;
//    }
//    else
//    {
//
//
//        int i = 0;
//        while (!feof(pf))
//        {
//            char str[256] = { 0 };
//            fgets(str, 256, pf);
//            i++;
//        }
//
//
//        fclose(pf);
//        return i;
//    }
//
//
//
//
//
//
//}
//
//
//
//
//
//
//
//
//
//void main()
//{
//
//
//    init(path);
//    while (1)
//    {
//        char str[128] = { 0 };
//        scanf("%s", str);
//        //search(str);
//        searchwiththread(str);
//    }
//
//
//
//
//
//    system("pause");
//}

nthreadinit, 0, &myinfo[0]);
    //WaitForSingleObject(pd1, INFINITE);//等待
    //strcpy(myinfo[0].findstr, "吴伟");
    //HANDLE pd2 = _beginthread(runthreadsearch, 0, &myinfo[0]);
    //WaitForSingleObject(pd2, INFINITE);//等待

    system("pause");
}

2.多线程检索内存‘

时间: 2024-10-10 09:07:00

多线程处理数据的相关文章

Web worker 多线程处理数据

流程:worker ------------àpostMessage----------------à任务沲----------------àpostMessage---------------à事件处理程序-------------------àonMessage------------------à返回信息. 写了一个成功的例子:(有两个文件,一个是主页文件 ,另一个是线程js文件) 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <

map集合分割以及多线程处理数据

测试主线程,MapFetch.java package com.sohu.servlet; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; /**  * @author liweihan ([em

mysql 参数 innodb_flush_log_at_trx_commit

问题,项目后台有一个定时任务,需要跑一批数据,跑完后存入到一个表里,用来做信息查询,数据大,逻辑复杂,耗时,多线程处理数据? 解答:以为程序的问题,把所有的关键点步骤都加上了日志,拿开发环境的日志看,一点没毛病,后来排查到Mysql,是不是服务器挂了,通过命令来查看,确实没有挂,是不是项目过载,也挂了,也没有,最后想起来,mysql可能不是实时刷入磁盘的,所有像运维拿到了my.cnf配置文件,果然是一个参数问题.运维让插入数据度快,innodb_flush_log_at_trx_commit 这

Elastic-Job - 分布式定时任务框架

Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.去掉了和dd-job中的监控和ddframe接入规范部分. ddframe其他模块也有可独立开源的部分,之前当当曾开源过dd-soa的基石模块DubboX. 项目开源地址:https://github.com/dangdangdotcom/elastic-job Elastic-Job主要功能 定时任务: 基于成熟的定时任务作业框架Quartz cron表达式执行定时任务. 作业注册中心: 基于Zook

ThreadPoolExecutor的一点理解

整个ThreadPoolExecutor的任务处理有4步操作: 第一步,初始的poolSize < corePoolSize,提交的runnable任务,会直接做为new一个Thread的参数,立马执行 第二步,当提交的任务数超过了corePoolSize,就进入了第二步操作.会将当前的runable提交到一个block queue中 第三步,如果block queue是个有界队列,当队列满了之后就进入了第三步.如果poolSize < maximumPoolsize时,会尝试new 一个Th

JAVA并发编程艺术 一(并发编程的挑战)

从今天起开始java并发编程艺术的学习,每一章学习完以后再这里记录下内容的重点,做个笔记,加深印象. 并发编程的目的是为了让程序运行的更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行.在进行并发是,如果希望通过多现场执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题,死锁的问题,以及受限于硬件和软件的资源限制问题,本章会介绍几种并发编程的挑战以及解决方案 1.上下问切换 即使是单核处理器也支持多线程执行代码,cpu通过给每个线程分配cpu时间片来实现这个机制.时间片是

如何减少并发编程中的上下文切换

一.首先,看看有什么工具可以度量上下文切换带来的消耗. 使用Lmbench3(一个性能分析工具)可以测量上下文切换时长 使用vmstat可以测量上下文切换的次数. 例如:在lunix命令界面:vmstat  2 1 CS(Content Switch)表示上下文切换的次数,从上面的测试结果中我们可以看到,上下文每一秒切换307次. 二.如何减少上下文切换 减少上下文切换的方法有无锁并发编程.CAS算法.使用最少线程和使用协程. 1. 无锁并发并发编程.多线程竞争锁时,会引起上下文切换,所以多线程

协程python

python中协程 在引出协成概念之前先说说python的进程和线程. 进程: 进程是正在执行程序实例.执行程序的过程中,内核会讲程序代码载入虚拟内存,为程序变量分配空间,建立 bookkeeping 数据结构,来记录与进程有关的信息, 比如进程 ID,用户 ID 等.在创建进程的时候,内核会为进程分配一定的资源,并在进程存活的时候不断进行调整,比如内存,进程创建的时候会占有一部分内存. 进程结束的时候资源会释放出来,来让其他资源使用.我们可以把进程理解为一种容器,容器内的资源可多可少,但是在容

多线程原理分析

转(http://www.cnblogs.com/guguli/p/5198894.html) Java对象实例的锁一共有四种状态:无锁,偏向锁,轻量锁和重量锁.原始脱离框架的并发应用大部分都需要手动完成加锁释放,最直接的就是使用synchronized和volatile关键字对某个对象或者代码块加锁从而限制每次访问的次数,从对象之间的竞争也可以实现到对象之间的协作.但是这样手动实现出来的应用不仅耗费时间而且性能表现往往又有待提升.顺带一提,之前写过一篇文章介绍我基于Qt和Linux实现的一个多