Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Przenoszenie własności wątku

Ostatnio zmodyfikowano 2013-05-05 22:29
Autor Wiadomość
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

C/C++
#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

C/C++
#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
C/C++
#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 ?
P-82138
Monika90
» 2013-05-05 21:50:15
Twój kod nie działa, ponieważ:
C/C++
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):
C/C++
thread_help a { thread( czytaj_B ) };
thread_help b { thread( czytaj_A ) };
P-82140
fers334
Temat założony przez niniejszego użytkownika
» 2013-05-05 22:29:21
Wielkie dzięki zapomniałem o tym.
P-82147
« 1 »
  Strona 1 z 1