Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:5
Форум » starterkit.ru » Embedded Linux
Вызов функции в разных потоках. Вопрос повторной входимости
kos
Добавлено 28.08.2014 14:27
0
Сообщение: 1
kos
0

Пункты: 2049
Регистрация: 04.04.2014
В написанной программе использую свою функцию читающую GPIO в двух разных потоках. И получаю странную ситацию иногда фукция возвращает мусор. Текст функции привожу ниже, в нее передается указатель на файл который определен глобально. Я его получаю только в одном месте при открытии файла. Более того файл открыт как readonly.

int ReadGPIO(int Gpio_fd)
{
char buffer[2];

lseek(Gpio_fd , 0, SEEK_SET);
if (read(Gpio_fd, buffer, 2)==-1) return -1;
return buffer[0]-0x30;
}

В одном потоке функция работает чудесно. В смысле БЕЗ чудес.
Было проверенно что портитися переменнная buffer в этой функции.

Если текст ф-ции изменть на

nt ReadGPIO(int Gpio_fd, char *buffer)
{

lseek(Gpio_fd , 0, SEEK_SET);
if (read(Gpio_fd, buffer, 2)==-1) return -1;
return buffer[0]-0x30;
}

и переменную buffer определить в вызывающем потоке то все работает корректно.

Мне не понятно почему вроде б локальная переменная buffer[2] портится.
И это касается только массива? Наприре если определить ее как short то все будет хрошо? Или никто ничего не гарантирует?
Спуститься к концу Подняться к началу
Персональная информация
yaka
Добавлено 30.08.2014 19:10 Сообщение: 2
yaka
0

Пункты: 739
Регистрация: 24.05.2013
Скорее всего, вызов функции ReadGPIO во втором потоке происходит между вызовом lseek и read в первом. В таком случае, когда произойдет вызов read в первом потоке, текущая позиция у файла уже не будет равна 0.

У Вас есть два варианта:

1. Использовать mutex для захвата блокировки доступа к файлу:

Код

pthread_mutex_t gpio_mutex;

int ReadGPIO(int Gpio_fd)
{
char buffer[2];
ssize_t res;

pthread_mutex_lock(&gpio_mutex);
lseek(Gpio_fd , 0, SEEK_SET);
res = read(Gpio_fd, buffer, 2)
pthread_mutex_unlock(&gpio_mutex);

if (res == -1)
return -1;
return buffer[0]-0x30;
}


2. Попробовать использовать pread:
Код

int ReadGPIO(int Gpio_fd)
{
char buffer[2];

lseek(Gpio_fd , 0, SEEK_SET);
if (pread(Gpio_fd, buffer, 2, 0) == -1)
return -1;
return buffer[0]-0x30;
}
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux