52.多线程查找数据

  • 设置线程信息结构体

    1 struct threadInfo
    2 {
    3     int *pstart;
    4     int length;
    5     int key;
    6     int id;
    7 };
  • 设置数组

    1 int a[100];
    2     time_t ts;
    3     srand((unsigned int)time(&ts));
    4     for (int i = 0; i < 100; i++)
    5     {
    6         a[i] = rand() % 10;
    7     }
  • 初始化线程结构体并开始线程

    1        struct threadInfo info[10];
    2      for (int i = 0; i < 10; i++)
    3     {
    4         info[i].pstart = a + i * 10;
    5         info[i].length = 10;
    6         info[i].key = 5;
    7         info[i].id = i;
    8         _beginthread(find, 0, &info[i]);
    9     } 
  • 多线程函数

     1 void find(void *p)
     2 {
     3     struct threadInfo *pinfo = p;//接受参数
     4     printf("线程%d开始\n", pinfo->id);
     5     for (int *px = pinfo->pstart; px < pinfo->pstart + pinfo->length; px++)
     6     {
     7         if (*px == pinfo->key)
     8         {
     9             printf("线程%d找到%d,%d\n", pinfo->id, px, *px);
    10             enQ(&my1, *px);//地址入队
    11         }
    12     }
    13     printf("线程%d结束\n", pinfo->id);
    14 }

    对传入的结构体进行多线程操作.

完整代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 #include <process.h>
 5 #include <windows.h>
 6 #include "queue.h"
 7
 8 myQ my1;//队列保存多线程的结果
 9
10 struct threadInfo
11 {
12     int *pstart;
13     int length;
14     int key;
15     int id;
16 };
17
18 void find(void *p)
19 {
20     struct threadInfo *pinfo = p;//接受参数
21     printf("线程%d开始\n", pinfo->id);
22     for (int *px = pinfo->pstart; px < pinfo->pstart + pinfo->length; px++)
23     {
24         if (*px == pinfo->key)
25         {
26             printf("线程%d找到%d,%d\n", pinfo->id, px, *px);
27             enQ(&my1, *px);//地址入队
28         }
29     }
30     printf("线程%d结束\n", pinfo->id);
31 }
32
33 void main()
34 {
35     init(&my1);//初始化队列
36     int a[100];
37     time_t ts;
38     srand((unsigned int)time(&ts));
39     for (int i = 0; i < 100; i++)
40     {
41         a[i] = rand() % 10;
42     }
43
44
45     struct threadInfo info[10];
46     for (int i = 0; i < 10; i++)
47     {
48         info[i].pstart = a + i * 10;
49         info[i].length = 10;
50         info[i].key = 5;
51         info[i].id = i;
52         _beginthread(find, 0, &info[i]);
53     }
54     Sleep(3000);
55     //弹出队列所有数据
56     while (!isempty(&my1))
57     {
58         printf("出队的数据:%d\n", getlast(&my1));
59         deQ(&my1);
60         print(&my1);
61     }
62
63     system("pause");
64 }

原文地址:https://www.cnblogs.com/xiaochi/p/8410702.html

时间: 2024-08-25 02:29:30

52.多线程查找数据的相关文章

多线程查找

1.本算法采用的是将多线程查找实现方法:将大批量数据切割分成多份,让线程去寻找,如果找到了,则返回数据 DavideSearch package cn.lonecloud.search; import java.util.LinkedList; import java.util.List; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; /** * @author lonecloud

9.20 windows静态库和动态库的使用 函数可变参 递归使用 多线程查找

指针内存面试题:                           对整个数组取地址+1前进了整个数组.再强转成double*  根据double*步长再减去1 #include <stdio.h> int main() { double db[5] = {1.0,2.0,3.0,4.0,5.0}; printf("%f\n", *((double *)(&db + 1) - 1)); // 结果输出5.0 return 0; } #include <std

iOS开发——实战篇Swift篇&amp;UItableView结合网络请求,多线程,数据解析,MVC实战

UItableView结合网络请求,多线程,数据解析,MVC实战 学了这么久的swift都没有做过什么东西,今天就以自己的一个小小的联系,讲一下,怎么使用swift在实战中应用MVC,并且结合后面的高级知识:网络请求,JSON数据解析一起应用到一个项目中来. 好了,废话不多说,我们直接开始吧. 首先看看最终的效果: 是不是很简单,就是个UItableView显示一些简单的数据,如果你真的觉得太简单了,那么请绕道,寻找更深入东西,但或者没有你想的那么简单,这不仅仅是一个tableView,为什么呢

java的二分法查找数据

Java二分法查找的源代码:    二分查找是一种高效率线性表的查找算法.在查找时必须将线性表中的关键词排好序.基本思路是:先断定线性表的中心方位 mid=(first+last)/2:对比所要查找的关键词 key与中心方位的关键词的巨细,假如比key和mid.key持平则回来: key比mid.key大(假定为升序)这所要查找的关键词在mid和last之间:否则在first与mid之间.持续按照上面办法查找中心元素,直到找到为止.    详细完成如下package com.cgogo; /**

JAVA笔记14__多线程共享数据(同步)/ 线程死锁 /

/** * 多线程共享数据 * 线程同步:多个线程在同一个时间段只能有一个线程执行其指定代码,其他线程要等待此线程完成之后才可以继续执行. * 多线程共享数据的安全问题,使用同步解决. * 线程同步两种方法: * 1.同步代码块 * synchronized(要同步的对象){ 要同步的操作 } * 2.同步方法 * public synchronized void method(){ 要同步的操作 } */ public class Main { public static void main(

JavaScript用二分法查找数据等

//二分法查数据 var arr=[41,43,45,53,44,95,23]; var b=44; var min=0; var max=arr.length; for(var i=1;i<arr.length;i++){ //外层循环控制排序的次数 for(var j=0;j<arr.length-i;j++){//内层循环控制循环的个数 if(arr[j]<arr[j+1]){ z=arr[j]; arr[j]=arr[j+1]; arr[j+1]=z; } } } // aler

Android多线程研究(6)——多线程之间数据隔离

在上一篇<Android多线程研究(5)--线程之间共享数据>中对线程之间的数据共享进行了学习和研究,这一篇我们来看看如何解决多个线程之间的数据隔离问题,什么是数据隔离呢?比如说我们现在开启了两个线程,这两个线程都要同时给同一个全局变量data赋值,各个线程操作它赋值后的变量数据,这里就需要用到隔离.先看一段代码: import java.util.Random; public class ThreadLocalTest { private static int data = 0; publi

多线程访问共享数据(1)

多线程访问共享数据解决方案: 一,什么是多线程 线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程. 所有的线程虽然在微观上是串行执行的,但是在宏观上你完全可以认为它们在并行执行 二,多线程访问共享数据解决方案 1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据.例如:卖票系统. 2,如果每个线程执行的代码不同,这个时候需要用不同的Runnable对象,有如下三种方式来实现这些Runnable对象之

多线程访问共享数据(2)

上篇博客介绍了不同情况下,多线程访问共享数据的不种解决.本篇博客接着介绍第二种情况(每个线程执行的代码不同)的其他解决方案. 如果每个线程执行的代码不同,这个时候需要用不同的Runnable对象,有如下三种方式来实现这些Runnable对象之间的数据共享: 将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象.每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对该数据进行的各个操作的互斥和通信. 将这些Runnable对象作为某一个类中的内部类,共