From ccab1d8e4990cfea505166917c9f4a457d3a6ed2 Mon Sep 17 00:00:00 2001 From: CGH0S7 <776459475@qq.com> Date: Sun, 8 Jun 2025 11:25:52 +0800 Subject: [PATCH] threadlab finished --- threadlab/SearchRandom | Bin 15672 -> 15696 bytes threadlab/SearchRandom-pthread | Bin 0 -> 16040 bytes threadlab/SearchRandom-pthread.c | 97 +++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 threadlab/SearchRandom-pthread create mode 100644 threadlab/SearchRandom-pthread.c diff --git a/threadlab/SearchRandom b/threadlab/SearchRandom index 349dc085294e30ad284057c6f62df181cb4d6402..9f26a36b55326c6235626dd5e670fa05c6d46e2e 100755 GIT binary patch delta 532 zcmdl{b)jm42IGZ^n)f-cGBJR`)y;y8;Y^I|lQWskMJ8@#4*%t``qUo}X7fE?f6hGT zoUFfj3$qK8WP%_>`3+kL%>khp1U3t@RdF$%p4=m#Rxj$&&B~|Gz~Iq(poH`P1Ah4i zkgCH_+N0Mt5+vDc8U&&=|9NzN@HqI+-s9j8W)H?=9vAnnJ=P{37)_c4l<;Qn`9Q8u--{epsd6gG`|NlREI234#NAnv2prZW{MKAUP zCH8|=KAk*6NKxf5knhpy`op6eh_zimcz}&uk8I?G&3A>Ac_$07D@;3X-9!^-;3QWGKtIv31GpC*tla#x& zvz3B|yI-iLf}ydVv7VuVk%5tkp`nrKx@y88;#r< zGdG_!@@HcVpDbyq&v`-!^o+&Wp%RviE} CakRPs delta 524 zcmcamwWDf+2IG#2n)f-sGBJR`*Uf^A;Y^JDlQWskMPyrE=m<{QT=VzHo3JReRi4_y z-u|1nFuO2GHV8tL->`+y91x1ZV6z}w6&K^{$vpyUxw0PJtbF zmu~?pk=(Y6(Deg6O0#Ta(JUTyk9Q?uTaqykJ2jel1i~mYwfCiq`gBU1) zX5eIhK~bFs+pj=rhEijXX4}~yR;Wkk(-K~fZrf`>-ha^!Ao;@i|NsBTSkFv$5L9Ih zpPVMRTg0PR^Z+jdL+3G%&g(ls4t(+R?_^UUd6g4?|NlRE7-Wb?^BVz=Ue@_QWgeZ! zU(5$e><6nnI=MnfQDrfZ@6qY{!=oFBwOu~|O`HT)iZHTZ^Ijok-bo4*ghW67|K9`D zoDQVd0BN>QlNTwZF*Z)-RFr4jJXsS+8g2GeZ0F&G1+&5Ao4WdpFE(@PIWbNC#3Vbp z!Qcnui^-LS?u@r5A2htqST%X3kvn7O=7&c9Y>efT4K4LKUkHKR2lUJ4OiOlVM(N3g dHs*{0lULfo~>ulfK0 diff --git a/threadlab/SearchRandom-pthread b/threadlab/SearchRandom-pthread new file mode 100644 index 0000000000000000000000000000000000000000..32e6290842a2635fc4e793375816ea911551772d GIT binary patch literal 16040 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 +#include +#include +#include // For sysconf + +// 随机数更新函数 (与原版相同) +void GenerateRandomNumber(unsigned int *rand1_h, unsigned int *rand1_l) { + unsigned long long x = (unsigned long long)*rand1_h; + x *= 0x6AC690C5; + x += *rand1_l; + *rand1_h = (unsigned int)x; + *rand1_l = (unsigned int)(x >> 32); +} + +// 定义传递给线程的参数结构体 +typedef struct { + unsigned int start; + unsigned int end; + unsigned int search_val; +} ThreadArgs; + +// 全局互斥锁,只用于保护printf函数,防止输出混乱 +pthread_mutex_t printf_mutex = PTHREAD_MUTEX_INITIALIZER; + +// 线程执行的函数 +void* search_worker(void* args) { + ThreadArgs* t_args = (ThreadArgs*)args; + unsigned int begin_h = t_args->end; + unsigned int begin_l = t_args->start; + unsigned int search_val = t_args->search_val; + + // *** 核心改动:不再提前退出,每个线程必须完成自己的任务 *** + for (unsigned int i = begin_l; i < begin_h; ++i) { + unsigned int h = i; + unsigned int l = 0x29A; + GenerateRandomNumber(&h, &l); + GenerateRandomNumber(&h, &l); + + if (l == search_val) { + // 找到结果,锁住互斥锁以安全地打印 + pthread_mutex_lock(&printf_mutex); + printf("找到啦~! 密码是 %08X (由线程 %lu 找到)\n", i, pthread_self()); + pthread_mutex_unlock(&printf_mutex); + // *** 核心改动:不再退出,继续搜索本线程范围内的其他可能解 *** + } + } + pthread_exit(NULL); +} + +int main() { + time_t begin_time, end_time; + const unsigned int search_val = 0x39A6FFBB; + + // 注意:原程序的循环条件是 i < 0xFFFFFFFF,所以它本身不会测试 0xFFFFFFFF + // 为了保持行为一致,我们将总范围设为 0xFFFFFFFF + const unsigned long long total_range_end = 0xFFFFFFFF; + + long num_threads = sysconf(_SC_NPROCESSORS_ONLN); + if (num_threads <= 0) { + num_threads = 4; // 默认值 + } + printf("这是一个修正后的Pthreads并行搜索程序,将使用 %ld 个线程。\n", num_threads); + + begin_time = time(NULL); + + pthread_t threads[num_threads]; + ThreadArgs thread_args[num_threads]; + + // 注意数据类型,防止溢出 + unsigned long long chunk_size = total_range_end / num_threads; + + for (long i = 0; i < num_threads; ++i) { + thread_args[i].start = i * chunk_size; + // 最后一个线程负责处理余下的所有范围 + thread_args[i].end = (i == num_threads - 1) ? total_range_end : (i + 1) * chunk_size; + thread_args[i].search_val = search_val; + + if (pthread_create(&threads[i], NULL, search_worker, &thread_args[i]) != 0) { + perror("Failed to create thread"); + return 1; + } + } + + // 等待所有线程完成 + for (long i = 0; i < num_threads; ++i) { + if (pthread_join(threads[i], NULL) != 0) { + perror("Failed to join thread"); + return 2; + } + } + + end_time = time(NULL); + printf("耗时 %ld 秒~~\n", end_time - begin_time); + + return 0; +} +