Invalid read of size 1 valgrind

0

Witam, mam zrobiony stos na globalnej tablicy wskaźników do znaków

#define MAX 100
char * in[MAX];
int stack_top = 0;

wstawiam do niej jakieś ciągi znaków oczywiście zakończone "\0",

gdy próbuje zaczytać funkcją ciąg znaków w pętli otrzymuję Invalid read of size 1 (funkcja value). Program niby działa ale niepokoi mnie ten błąd.

inline bool push(char *element)
{
  if(stack_top>=MAX) return 0; //stack full
 
  in[stack_top++] = element;
  return 1;
}
 
inline int pop()
{
  if(stack_top==0) return ERROR; //nothing to remove
 
  --stack_top;
  return 1; //udało się usunąć
}
 
inline bool empty()
{
  if(stack_top==0) return 1; //stack is empty
 
  return 0; // stack is not empty
} 
 
inline unsigned int size()
{
  return stack_top; // stack size
}
 
inline char* value()
{
  if(empty()) return ""; //stack is empty
 
  return in[stack_top-1];
}

dodam, że z tego stosu korzystają 2 wątki jeden podbija stos drugi czyta i zdejmuje ze stosu.

0

Fakt że oba wątki mogą modyfikować stack_top jednocześnie, bez synchronizacji, już wskazuje że coś może być nie tak.

0

Rzeczywiście muszę poczytać o synchronizacji, nie zrobiłem jej, pierwszy raz muszę skorzystać ze zmiennych globalnych współdzielonych przez wątki. Kompilator mi nie zwracał błędów, coś mi tu nie pasowało, a teraz już widzę że to ma sens... Dzięki!
Jakby ktoś podesłał jakiś sensowny link do lekturki tego problemu byłbym wdzięczny choć spróbuję trochę pogooglować. (albo inaczej może ktoś już może z doświadczenia naprowadzić na wydajny sposób synchronizacji :) bo widzę że jest ich kilka)

0

ok ale z tego co widzę chyba mutex nie załatwi sprawy chciałbym aby ten program działał tak że odpalam każdy wątek co sekundę i on działa dopóki jeden nie uzupełni tabelki drugi dopóki jej nie wyczyści i mają tak działać w nieskończoność. pierwszy wątek będzie zbierał cyklicznie jakieś dane do analizy drugi wątek zdejmuje ma je przetwarzać i wyświetlać. może coś innego?

1 użytkowników online, w tym zalogowanych: 0, gości: 1