记一次 c 语言 的 多线程查找 简单实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//仅供参考学习
#define _CRT_SECURE_NO_WARNINGS //屏蔽 vs 的a
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <process.h>
#include <time.h>
#include <memory.h>


//直接改 m_MAX 的值则是改变总的范围
#define m_MAX 250000 //最好是 totalThread 的整数倍



typedef struct s{
int *begin;//每个线程其实索引地址
int lenth;//索引长度
int target;//need find
int Id;//thread id
int *flag;//线程之间通信
int *isFind;//附加功能标记那个线程找到的
}s_t;



void find(void *p)
{
s_t* pS = (s_t*)p;//indo

int* cur = NULL;//need find number addres

for (cur = pS->begin; cur != pS->begin + pS->lenth; ++cur)
{
if (1 == *(pS->flag))
{
char str[100] = { 0 };
sprintf(str, " thread %d incapable been thread %d Preemptive\n", pS->Id, *(pS->isFind));
printf("%s", str);
_endthread();
}
if ((*cur) == pS->target)
{
printf(TEXT("thread %d finde \n"), pS->Id);
printf(" %d\n", *cur);
Sleep(10);
*(pS->flag) = 1;
*(pS->isFind) = pS->Id;

_endthread();
}
}
{//快语句 看起来 代码整洁
char str[100] = { 0 };
sprintf(str, " Thread %.5d is incapable \n", pS->Id, *(pS->isFind));
printf("%s", str);
}

_endthread();
}


int main()
{
srand((unsigned int)time(NULL));

//需要寻找的源
int array[m_MAX];

//标志位
int flag = 0;
int isFind = 0;

//随机的目标
int target = rand() % m_MAX;
printf("Need find number is %d \n", target);


int totalThread = 50;

//线程需要的信息
s_t s[50]; //设定线程个数 ## 这里的 50 与 totalThread 变量是相关的 要改都改

int dividedDataSize = (m_MAX / totalThread); //设定每个线程需要索引的大小


//随机初始化 源内的数据
for (int j = 0; j < m_MAX; ++j) {
array[j] = rand()%m_MAX;
}

//初始化每个线程
for (int i = 0; i < totalThread; ++i)
{
s[i].begin = array + (i*dividedDataSize);
s[i].Id = i;
s[i].lenth = (dividedDataSize);
s[i].target = target;
s[i].flag = &flag;
s[i].isFind = &isFind;
_beginthread(find, 0, &s[i]);
Sleep(10);  //避免出现线程访问冲突
}


system("pause");
return 0;
}