On Thursday, 29 August 2019 at 09:04:17 UTC, Simen Kjærås wrote:
On Wednesday, 28 August 2019 at 13:11:46 UTC, Jabari Zakiya wrote:
[...]

Reduced example:

unittest {
    int[] a;
// cannot implicitly convert expression a of type int[] to shared(int[])
    shared int[] b = a;
}

This is because an int[] is mutable and thread-local, while shared(int[]) is mutable and shared. Shared mutable data must be guarded closely, preferably behind a mutex or similar. Assigning the value of `a` to `b` above would leave a mutable reference to the shared data on a thread, and could easily lead to race conditions.

In order to fix this issue, consider several things:

Do modpg and friends really need to be shared? Removing shared() from them will still make them available to other parts of your code, but they will be thread-local instead. If you're not doing threaded work, that should be perfectly fine.

Can they be immutable? If they're initialized once and never changed, this could be a good solution.

If they need to be shared and mutable, have you protected them enough from race conditions? Are there possible situations where other threads may be accessing them while one thread is writing to them?

Multi-threaded programming is hard, and requires a lot more knowledge than we have about your project from the code you've posted, so only you can answer these questions. If you're unsure, you can probably just remove shared() from modpg and friends.

--
  Simen

The values modpg, res_0, restwins, and resinvrs are constant (immutable) values that are generated at run time. They are global/shared and used inside threads.

So this process is initializing them at the start of the program, based on the input values to it.

The compiler only has a problem, it seems, with the arrays and not the single values.

Reply via email to