2010-11-26 4 views

Antwort

5

Was? t ist ein Thread, es "sieht" nichts wirklich. Streng genommen handelt es sich um eine Variable, die einen Thread darstellt - Sie haben tatsächlich keinen Thread erstellt. Wenn Sie jedoch einen Thread erstellen, wird dieser im selben Prozess wie main() ausgeführt, sodass er Speicherplatz in diesem Sinne freigibt. t teilen Sie den Umfang der wichtigsten. Die Funktionen, die in diesem Thread ausgeführt werden, können sehen, welche Variablen für diese Funktionen gelten.

Sie könnten einen Zeiger auf i als Benutzerdatenzeiger an pthread_create übergeben. Oder wenn Sie auf mehr als nur i zugreifen müssen, könnten Sie einen Zeiger auf eine Struktur übergeben, die (unter anderem) einen Zeiger auf i usw. enthält.

Beispielcode:

#include <pthread.h> 
#include <iostream> 
#include <cstring> 

void *thread_entry_point(void *data) { 
    int *idata = static_cast<int*>(data); 
    std::cout << "thread: i = " << *idata << "\n"; 
    *idata = 23; 
    return const_cast<char*>("might as well return something"); 
} 

int main() { 
    int i = 12; 
    pthread_t thr; 

    int err = pthread_create(&thr, 0, thread_entry_point, &i); 
    if (err == 0) { 
     void *result; 
     pthread_join(thr, &result); 

     std::cout << "main: result = " << static_cast<const char*>(result) << "\n"; 
     std::cout << "main: i = " << i << "\n"; 
    } else { 
     std::cout << "error creating thread: " << err << " " << std::strerror(err) << "\n"; 
    } 
} 
+0

Nun ... Sie können '& i' als Argument an den Thread übergeben, um es in den Bereich der Thread-Funktion zu setzen. –

+0

@ André: Ja, ich komme dahin :-) –

+0

& Andre. Kann jemand den vollständigen Arbeitscode einfügen, um zu zeigen, wie es funktioniert? Offensichtlich bin ich neu in Pthread. – vrbilgi

3

pThreads sind nicht besonders. Zum Beispiel hat der folgende Code das gleiche „Problem“:

void foo() 
{ 
    i = 5; 
} 
int main() 
{ 
    int i; 
    foo(); 
} 

Sicher foo von main genannt wird, so dass sie auch auf dem gleichen Thread. Noch foo sieht die int in main nicht. Die Lösung ist einfach: Wenn foo eine int muss, sollte main dass passieren:

void foo(int& i) 
{ 
    i = 5; 
} 
int main() 
{ 
    int i; 
    foo(i); 
} 

Mit Gewinde ist die Situation die gleiche: geben, was Sie teilen müssen.