gpt4 book ai didi

c++ - 从另一个线程终止 C++ 中的线程

转载 作者:可可西里 更新时间:2023-11-01 10:08:10 24 4
gpt4 key购买 nike

基本上我是在用两个线程寻找素数。我将每个线程的可能素数范围分成两半,或者以其他方式在线程之间静态分配范围。然而,必须处理较小数字的线程将不可避免地在计算较大数字的线程之前完成。我想要做的是,只要任一线程通过它的范围,就终止两个线程,然后将尚未完成的线程的剩余范围的一半交给完成的线程,这样它们就会递归地平衡并且将始终并行运行。例如:A(1-100) 和 B(100-200),A 先完成,而 B 仍在 150。两者都停止,A 开始像 A(150-175),B 像 B(175-200)。

到目前为止,这是我的代码:

#include <windows.h>
#include <stdio.h>
#include <process.h>
#include <queue>
#include <cmath>
#include <iostream>
using namespace std;
priority_queue<int> primes;
CRITICAL_SECTION critical;
struct args
{
int begin;
int end;
}par1, par2;

int e_prosto(int n)
{
for(int i = 2; i*i<(n + 1) ; i++)
if (n & 1 == 0 || n % i == 0) return 0;
return 1;
}

unsigned int __stdcall rabotnik(void* n)
{
struct args *lPar = (args*) n;
for(int i = lPar->begin; i < lPar->end; i++)
{
if(e_prosto(i)){
EnterCriticalSection(&critical);
primes.push(i);
LeaveCriticalSection(&critical);
}
}
return 0;
}

int main()
{
int foo;
printf(" Tarsene na prosti do: ");
scanf("%d", &foo);
par1.begin=1;
par1.end=foo/2+1;
par2.begin=foo/2+1;
par2.end=foo;

HANDLE hvadkaA, hvadkaB;
InitializeCriticalSection(&critical);
SYSTEMTIME st, now, then;

hvadkaA = (HANDLE)_beginthreadex(0, 0, &rabotnik, (void*)&par1, 0, 0);
hvadkaB = (HANDLE)_beginthreadex(0, 0, &rabotnik, (void*)&par2, 0, 0);
::GetSystemTime(&then);
WaitForSingleObject(hvadkaA, INFINITE);
WaitForSingleObject(hvadkaB, INFINITE);

CloseHandle(hvadkaA);
CloseHandle(hvadkaB);

::GetSystemTime(&now);
while(!primes.empty())
{
printf("%d \t", primes.top());
primes.pop();
}
printf("\nGotov za %d milisec", abs(now.wMilliseconds - then.wMilliseconds));
system("pause>nul");
return 0;
}

最佳答案

暴力终止线程不是一个好主意,因为它会使您的进程处于不良状态。如果您的线程在循环中运行,您可以在外部设置一些标志,线程可以测试并决定是否终止自身(这可以通过简单地退出 thead 函数来完成)。请记住使用互斥锁保护您的标志。

您可能还想了解一些其他模式。您可能希望将您的素数范围放入队列中。然后每个工作线程都可以从队列中提取值并执行搜索。这样您就可以平均分配负载,而无需终止和重新启动线程。

关于c++ - 从另一个线程终止 C++ 中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9473710/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com