Adăugarea de fișiere POSIX pe XCode

Programul ar trebui să obțină argumente de la o linie de comandă și să adauge argumentele prin fire posix. Dar Xcode o construiește cu succes, dar nu oferă nicio ieșire. Există ceva în neregulă cu acest cod.  Mulțumiri

#include 
#include 

using namespace std;

void *Add(void *threadid){
  long tid;
  tid =(long)threadid;
  long sum=0;
  sum=sum+tid;
  printf("%ld.\n",sum);
  pthread_exit(NULL);
}    

void *Print(void *threadid){
  long tid;
  tid =(long)threadid;

  printf("%ld.\n",tid);
  pthread_exit(NULL);
}   

int main (int argc, char const *argv[])
{
  if(argc<6){
    printf("you need more arguments");
    return -1;
  }

  long real[5];
  pthread_t athread,bthread;

  for (int x=1;x<=5;x++)
    real[x-1]=atol(argv[x]);

  for(int y=1;y<=5;y++)
    pthread_create(athread[y],NULL,Add,(void *)&real[y]);

  for(int y=1;y<=5;y++)
    pthread_create(bthread[y],NULL,Print,(void *)&real[y]);

  pthread_exit(NULL);
  return 0;
}
0
Îmi pare rău, am uitat parantezele când postez. Sunt în codul real
adăugat autor user1424263, sursa
Această întrebare este indescifrabilă. "adăugați argumentele într-un posix"? "Xcode nu oferă nici o ieșire, adresa" Output/address for what? Ce este "dbll"? În ceea ce privește codul, evident, nici măcar primul lucru nu a fost făcut pentru a rula codul. #include iostream nu include chiar paranteze sau ghilimele necesare.
adăugat autor bames53, sursa
Bine, asta e bine, dar e cea mai mică problemă aici. Puteți să vă modificați întrebarea pentru ao îmbunătăți. Dacă faceți mai clar ce vă cereți, veți avea mai multe șanse de a obține răspunsuri utile.
adăugat autor bames53, sursa

2 răspunsuri

First of all, printf is defined in stdio.h and not in iostream. If you'd like to do it the C++ way with iostream, then cout << "Blabla " << var << endl; should be used instead.

În al doilea rând, apelați pthread_create cu argumente greșite. Așa cum sunt definite athread și bthread nu sunt matrice, ci le folosiți ca atare. Nu sunt sigur de ce ar compila acest lucru, deoarece pthread_create se așteaptă ca pthread_t * să fie primul argument și să oferiți * pthread_t . În cazul în care codul se compilează vreodată, acesta va fi cel mai probabil căderat când se execută.

În al treilea rând, nu vă alăturați subiectelor adderate. Aceasta înseamnă că firele dvs. de tipărire ar putea începe înainte de terminarea thread-urilor.

În al patrulea rând, vă însumați în variabilele locale. Ar trebui să vă înscrieți într-unul global. Nu uitați să păstrați accesul la el printr-un mutex sau altceva.

Fifth, arguments to the thread routines are wrong. You are passing pointer to the value and not the value itself and later reinterpreting the pointer as the value itself. You would most likely want to use (void *)real[y] and not (void *)&real[y]. Mind that casting long to void * doesn't work on all systems. On Mac OS X both long and void * are of the same length (either 32 or 64 bits) but this is not true in general.

Editat: Codul dvs. nu se compilează chiar pe OS X:

$ g++ -o t.x t.cpp
t.cpp: In function ‘int main(int, const char**)’:
t.cpp:37: error: cannot convert ‘_opaque_pthread_t’ to ‘_opaque_pthread_t**’ for argument ‘1’ to ‘int pthread_create(_opaque_pthread_t**, const pthread_attr_t*, void* (*)(void*), void*)’
t.cpp:40: error: cannot convert ‘_opaque_pthread_t’ to ‘_opaque_pthread_t**’ for argument ‘1’ to ‘int pthread_create(_opaque_pthread_t**, const pthread_attr_t*, void* (*)(void*), void*)’

$ clang -o t.x t.cpp
t.cpp:37:5: error: no matching function for call to 'pthread_create'
    pthread_create(athread[y],NULL,Add,(void *)&real[y]);
    ^~~~~~~~~~~~~~
/usr/include/pthread.h:304:11: note: candidate function not viable: no known
      conversion from 'struct _opaque_pthread_t' to 'pthread_t *' (aka
      '_opaque_pthread_t **') for 1st argument;
int       pthread_create(pthread_t * __restrict,
          ^
t.cpp:40:5: error: no matching function for call to 'pthread_create'
    pthread_create(bthread[y],NULL,Print,(void *)&real[y]);
    ^~~~~~~~~~~~~~
/usr/include/pthread.h:304:11: note: candidate function not viable: no known
      conversion from 'struct _opaque_pthread_t' to 'pthread_t *' (aka
      '_opaque_pthread_t **') for 1st argument;
int       pthread_create(pthread_t * __restrict,
          ^
2 errors generated.

Nu vedeți nici măcar mesajele de eroare pe care XCode le furnizează?

0
adăugat
Ai dreptate. Mi-a lipsit asta în documentația pthread_exit ().
adăugat autor bames53, sursa

Mai întâi de toate cred că ar trebui să verificați dacă metoda pthread_create a avut succes. Nu am expirience în pthread sub Apple, dar pe baza acestui cod cred că aveți probleme cu crearea de fire.

0
adăugat
+1 - nu omiteți verificarea erorilor!
adăugat autor Jonathan Wakely, sursa
Da, codificați încă barajele, athread și bthread nu sunt matrice. Asigurați-vă că aveți consola Xcode deschisă, și deschideți debuggerul prea.
adăugat autor jiveturkey, sursa