2013-06-26 3 views
1

Утром все,Неприятности с резьбой

Я пытался создать очень простое приложение с одной нитью, которая бы просто изменить значение переменной объекта, а затем распечатать его на экране. Итак, всякий раз, когда я запускаю программу, поток инициализируется правильно, но он возвращает некоторые значения мусора для object->a.

Не могли бы вы дать мне несколько указаний относительно того, как я могу заставить это работать?

Спасибо большое. Alex

HANDLE hPrintMutex; 
int ThreadNr; 

class object 
{ 
    public: 
     int a; 
     object(void); 
}; 

object::object(void) 
{ 
    a=1; 
} 


void printNumber(void * arg) 
{ 
    object * x=(object*) arg; 
    std::cout<<"Thread1 -> "<< x->a<<"\n";; 
    while(x->a<10) 
    { 
     WaitForSingleObject(hPrintMutex,INFINITE); 
     x->a=5; 
     ReleaseMutex(hPrintMutex); 
    } 
} 

int main() 
{ 
    object * Object; 
    Object = new object; 

    hPrintMutex=CreateMutex(NULL,false,NULL); 
    std::cout << "Main -> "<<Object->a<<"\n"; 

    HANDLE hThread1=(HANDLE)_beginthread(printNumber,0,&Object); 

    WaitForSingleObject(hThread1,INFINITE); 
    return 0; 
} 
+0

Есть ли какие-либо конкретные причины вы не используете std :: thread, std :: mutex или даже std :: atomic? – PlasmaHH

+0

Нет причин, я просто не мог найти лучшего примера для изучения потоков C++. Все другие примеры казались очень трудными для понимания. – Wracker

+1

@Wracker Я считаю, что это windows api, поэтому их нельзя по праву назвать потоками C++. Взгляните на [std :: thread] (http://en.cppreference.com/w/cpp/thread/thread/thread), это новый и «правильный» способ делать потоки сейчас. –

ответ

3

Вы передаете object ** к потоку, но воспринимая его как object *

Вам не нужен & в

HANDLE hThread1=(HANDLE)_beginthread(printNumber,0,&Object); 
               ^
+0

ohh сэр ваш гений :) .. спасибо! – Wracker

+0

@Wracker приветствуется! Кстати, поскольку вы учитесь, я должен сказать, ваш стиль именования немного запутан. Обычно имена классов находятся в шапках, то есть 'Object', а имена переменных не являются, то есть' object'. –