Использование макросов переменных ThreadSafe в LabWindows / CVI

Я использую потокобезопасную переменную в среде LabWindows / CVI и наблюдали, что можно получить указатель на потокобезопасную переменную до того, как она будет выпущена. (из предыдущего запроса)

Поскольку данные, которые мне интересны для защиты, - это struct, я не могу явно установить уровень вложенности, поэтому я предполагаю, что уровень вложенности остается равным 0, т.е. что после того, как был выпущен один потокобезопасный указатель, запрос на второй будет отказано до тех пор, пока не будет выпущен первый. Однако я заметил, что это не так, проходя сеанс отладки. Выполнение продолжается через оператор DefineThreadSafeVar(CLI, SafeCli);, продолжая использовать клавишу F8 step-into, и последующие запросы указателя на потокобезопасную переменную удовлетворяются без освобождения оригинал.

Мои ожидания заключаются в том, что эти макросы должны предотвращать доступ к потокобезопасной переменной после того, как указатель на нее был выдан, но еще не выпущен.

Мои ожидания неверны?
Или я неправильно реализовал звонки?

Вот мой исходный код:

#include <utility.h>

typedef struct  {
    int hndl;
    int connect;
    int sock;
}CLI;

DefineThreadSafeVar(CLI, SafeCli);

void func1(void);
void func2(void);

int main(void)
{
    InitializeSafeCli(); 
    func1();

    return 0;
}

void func1(void)
{
    CLI *safe;
    safe = GetPointerToSafeCli();//original issue
    safe->connect = 2;
    safe->hndl = 3;
    safe->sock = 4;
    func2();
    safe->connect;
    safe->hndl;
    safe->sock;
    ReleasePointerToSafeCli();
}

void func2(void)
{
    CLI *safe;
    safe = GetPointerToSafeCli();//request is granted. previous issue had not been released.  
                                 //shouldn't request have been denied ?
    safe->connect = 5;//variable is modified.
    safe->hndl = 6;
    safe->sock = 7;
}

person ryyker    schedule 24.08.2015    source источник
comment
Возможно ли, что, поскольку вы вызываете func2() в том же потоке, он просто уже имеет к нему доступ? Понимая, что у вас может быть больше кода, помимо этого примера, в этом случае вы не запускаете несколько потоков. func2() находится в том же стеке вызовов, поскольку он вызывается внутри func1 () и, следовательно, в том же потоке.   -  person Talaria    schedule 04.01.2016


Ответы (1)


В вашем случае вы вызываете func2() в func1(), а затем находитесь в том же стеке вызовов и, следовательно, в том же потоке. Вам предоставлен доступ, потому что вы запрашиваете указатель из того же потока, у которого уже есть доступ к указателю.

GetPointerToSafeCli() - это ожидающий вызов. Если бы он был вызван из потока A, а затем снова в потоке B до того, как ReleasePointerToSafeCli() был вызван обратно в потоке A, поток B будет ждать, пока указатель не будет освобожден, прежде чем предоставить доступ.

LabWindows / CVI - Программирование с помощью DefineThreadSafe / а>

person Talaria    schedule 04.01.2016
comment
Спасибо! Я думаю, это подводит итог. - person ryyker; 04.01.2016