나는 장벽 클래스를 구현하려고 시도했다. 분할 및 정복 알고리즘을 사용하여이를 테스트하고 싶습니다. 내 클래스는 다음과 같이 정의된다 : 분할에 관해서는divide and conquer (바쁜 동안 뮤텍스가 파괴됨)를 사용하는 배리어 클래스 C++
class barrier{
private:
mutex mtx;
condition_variable cv;
atomic<int> counter;
atomic<int> waiting;
atomic<int> thread_count;
public:
barrier(int count) : thread_count(count), counter(0), waiting(0) {}
void wait()
{
//fence mechanism
unique_lock<mutex> lock(mtx);
++counter;
++waiting;
cv.wait(lock, [&] {return counter >= thread_count; });
--waiting;
if (waiting == 0) counter = 0;
for (int i = 0; i < thread_count; ++i) cv.notify_one();
lock.unlock();
}
};
및 알고리즘을 정복 다음, 나는 그것을 구현했습니다 : 이것은 그러나 "바쁜 동안 파괴 뮤텍스"결과
int main() {
vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
int n = size(v)/2;
while (n >= 1) {
dnc_light(v, n);
n /= 2;
}
return 0;
}
void dnc_light (vector<int> &v, int n) {
thread trd[50];
barrier bar(n);
for (int i = 0; i < n; ++i) {
trd[i] = thread([&] {
v[i] += v[i + n];
bar.wait();
});
}
}
- 오류 . 어째서? 동적으로 barrier bar(...)
의 크기를 처리해야합니다.
방금 테스트 해본 결과 제안 사항이 적용되었습니다. 두 가지 질문이 있습니다 : 단지'dnc_light'에 스레드를 결합하는 대신 분리 할 수 있습니까? 어제 주 코드에서 모든 것을 코딩 해 보았습니다.하지만 동일한 오류가 발생했습니다. for-loop 이후에 장벽이 파손 되었기 때문입니까? – SAFD
@SAFD 연결을 피하기 위해 스레드를 분리 할 수 있습니다. 그러나이 경우 장벽이 살아 있는지 확인해야합니다. 이를 수행하는 한 가지 방법은'auto barrier = make_shared (n);'이며 쓰레드에 값으로'barrier' 스마트 포인터를 넘겨 사용 중에도 살아있게합니다. –
그래, 너무 복잡해서 나 두렵다. 몇 가지 추가 테스트를 한 결과, 합계가 항상 136이 아닌 것으로 나타났습니다. 때때로 스레드가 계산을 엉망으로 만듭니다. 그래서'dnc_light'를 변경했습니다 : 이제'v' byvalval을 잡아서 합계를 저장하는'temp'라는 벡터를 갖습니다. 이로 인해 문제가 해결되었습니다. 지금 내가 얻는 유일한 오류는 임의의 합계가 결국 '0'이된다는 것입니다. – SAFD