Functionally, dequeueing a SEQ is analogous to reading the DVR in "In Place Element" and analogous to locking a mutex.
The 2 LabVIEW code paths above are analogous to this C++ code snippet:
// Global variable and mutex
std::mutex mtx;
int* globalvar = new int; // 1a. Initialize shared resource ("Obtain Queue")
int main()
{
// 1b. Initialize shared resource ("Enqueue Element")
*globalvar = 0;
// 2. Lock shared resource ("Dequeue Element")
mtx.lock();
// 3. Modify shared resource ("Increment")
*globalvar += 1;
// 4. Unlock shared resource ("Enqueue Element")
mtx.unlock();
// 5. Free/Delete shared resource ("Release Queue")
delete globalvar;
}
Notes:
It doesn't make much sense to use a global pointer-to-integer in C++; we would just use a global integer directly (or find ways to avoid globals altogether).
The code above is to show equivalence to LabVIEW nodes; you'll get funny looks if you present C++ code like this.
Using a SEQ like this is unintuitive. Using Queue concepts to share data and lock/unlock access is borderline API abuse.
Likewise, using a non-reentrant VI's internal state to act as a global variable (i.e. Functional Globals) is borderline API abuse.
Therefore, I would not introduce SEQs and FGVs to newcomers until they are comfortable with other basic concepts of LabVIEW. I would not use them as a starting point for discussions.
Nonetheless, we accept/embrace SEQs because they are useful (FGVs are less useful since proper Global Variables exist now).
I consider DVRs more intuitive than SEQs, but I prefer SEQs on a block diagram as they don't require the huge rectangular frame.