diff --git a/threadlab/SearchRandom b/threadlab/SearchRandom index 349dc08..9f26a36 100755 Binary files a/threadlab/SearchRandom and b/threadlab/SearchRandom differ diff --git a/threadlab/SearchRandom-pthread b/threadlab/SearchRandom-pthread new file mode 100644 index 0000000..32e6290 Binary files /dev/null and b/threadlab/SearchRandom-pthread differ diff --git a/threadlab/SearchRandom-pthread.c b/threadlab/SearchRandom-pthread.c new file mode 100644 index 0000000..46560f2 --- /dev/null +++ b/threadlab/SearchRandom-pthread.c @@ -0,0 +1,97 @@ +#include +#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; +} +