Я использую потокобезопасную переменную em > в среде 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;
}
func2()
в том же потоке, он просто уже имеет к нему доступ? Понимая, что у вас может быть больше кода, помимо этого примера, в этом случае вы не запускаете несколько потоков.func2()
находится в том же стеке вызовов, поскольку он вызывается внутри func1 () и, следовательно, в том же потоке. - person Talaria   schedule 04.01.2016