I would like to access a __gshared variable from a function. The code snippet is like this:

import vibe.d;

struct Student
    string name;
    uint number;

class StudentStore
    Student[][string] store;
    static Student[0] empty;
    Student[] getNotes(string id)
         return (id in store) ? store[id] : empty;
    private __gshared StudentStore studentStore;
    shared static this()
        studentStore = new StudentStore();

void listStudents(HTTPServerRequest req, HTTPServerResponse res)
    auto allstudents = studentStore.getNotes(req.session.id);

void main()
    auto router = new URLRouter;
    router.get("/", staticTemplate!"index.dt");
    router.get("*", serveStaticFiles("public/"));

    auto settings = new HTTPServerSettings;
    settings.port = 8080;
    settings.bindAddresses = ["::1", ""];
    listenHTTP(settings, router);

    logInfo("Lütfen tarayıcınızda adresini açınız.");

As I know, there are two ways to make a variable available across threads in D: __gshared and shared .

The former has no guarantees. All it does is put the variable in global storage, making it just like any global variable in C or C++.

The latter actually affects the type of the variable; the compiler is able to help prevent the variable from being used in ways it shouldn't be.

When I try to access __gshared variable studentStore, I get undefined identifier error.

source/app.d(26,24): Error: undefined identifier studentStore, did you mean class StudentStore?

What might be the cause of this?