Przenoszenie własności wątku
Ostatnio zmodyfikowano 2013-05-05 22:29
fers334 Temat założony przez niniejszego użytkownika |
Przenoszenie własności wątku » 2013-05-05 21:33:32 Siemka mam problem mianowicie nie wiem dlaczego poniższy kod się nie wykonuje : Plik thread_help.h #ifndef THREAD_X_H #define THREAD_X_H
#include <thread>
class thread_help { std::thread t; public: explicit thread_help( std::thread x ) : t( std::move( x ) ) { if( !t.joinable() ) { throw "Brak Watku "; } } ~thread_X() { t.join(); } thread_help( thread_help const & ) = delete; thread_help & operator =( thread_help const & ) = delete; }; #endif Plik hierarchical_mutex.h #ifndef HIERARCHICAL_MUTEX_H_INCLUDED #define HIERARCHICAL_MUTEX_H_INCLUDED
#include <mutex> using namespace std;
class hierarchical_mutex { mutex internal_mutex; unsigned long const hierarchy_value; unsigned long previous_hierarchy_value; static thread_local unsigned long this_thread_hierarchy_value; void check_for_hierarchy_violations() { if( this_thread_hierarchy_value <= hierarchy_value ) { throw "ERROR ---> Naruszono hierarchie"; } } void update_hierarchy_value() { previous_hierarchy_value = this_thread_hierarchy_value; this_thread_hierarchy_value = hierarchy_value; } public: explicit hierarchical_mutex( unsigned long value ) : hierarchy_value( value ) , previous_hierarchy_value( 0 ) { } void lock() { check_for_hierarchy_violations(); internal_mutex.lock(); update_hierarchy_value(); } void unlock() { this_thread_hierarchy_value = previous_hierarchy_value; internal_mutex.unlock(); } bool try_lock() { check_for_hierarchy_violations(); if( !internal_mutex.try_lock() ) { return false; } update_hierarchy_value(); return true; } };
thread_local unsigned long hierarchical_mutex::this_thread_hierarchy_value( ULONG_MAX );
#endif plik main.cpp #include <iostream> #include <thread> #include "hierachical_mutex.h" #include "thread_help.h"
using namespace std; hierarchical_mutex blokada( 8000 );
void lag() { for( int i = 0; i < 100000000; i++ ) { } } void czytaj_A() { for( int i = 0; i < 100; i++ ) { lock_guard < hierarchical_mutex > lock( blokada ); lag(); cout << " --------> A " << endl; } } void czytaj_B() { for( int i = 0; i < 100; i++ ) { lock_guard < hierarchical_mutex > lock( blokada ); lag(); cout << " --------> B " << endl; } } int main() { thread_help a( thread( czytaj_B ) ); thread_help b( thread( czytaj_A ) ); system( "PAUSE" ); return 0; } Problem tkwi w tym że oba watki nic nie robią, nawet konstruktor obiektu thread_help nie rusza do pracy chyba że zmienie argument wywolywania na inny w czym tkwi problem ? |
|
Monika90 |
» 2013-05-05 21:50:15 Twój kod nie działa, ponieważ: thread_help a( thread( czytaj_B ) ); thread_help b( thread( czytaj_A ) );
nie tworzy obiektów, ale deklaruje dwie funkcje nazwane a i b. Zrób tak (klamry zamiast nawiasów): thread_help a { thread( czytaj_B ) }; thread_help b { thread( czytaj_A ) };
|
|
fers334 Temat założony przez niniejszego użytkownika |
» 2013-05-05 22:29:21 Wielkie dzięki zapomniałem o tym. |
|
« 1 » |