synchronized classes and shared

Loara loara at noreply.com
Fri Aug 19 11:05:16 UTC 2022


On Thursday, 18 August 2022 at 11:18:18 UTC, frame wrote:
>
> It does not - which compiler version are you using?
>
> Error: `shared` method `app.A.this` is not callable using a 
> non-shared object

v2.100.0

>
> And it shouldn't - shared (atomic lock free) and synchronized 
> (locking) are different concepts.

`shared` means that data can be accessed by different threads, 
indeed when you want to send a pointer to another thread the 
pointed data must be `shared` even if it's a `synchronized` 
class. For example the following code
```d
import std.stdio;
import std.concurrency;

synchronized class A{
   private:
     int a;
   public:
     this() pure {
       a = 1;
     }

     int getA() pure{
       return a;
     }
}

void thread(A a){
   writeln(a.getA());
}

int main(){
   auto c = new A();
   spawn(&thread, c);
   return 0;
}
```
won't compile
```
main.d(18): Error: `shared` method `main.A.getA` is not callable 
using a non-shared object
/usr/include/dlang/dmd/std/concurrency.d(519): Error: static 
assert:  "Aliases to mutable thread-local data not allowed."
main.d(23):        instantiated from here: `spawn!(void 
function(A), A)`
```
if you want to compile it your class must be `shared`
```d
import std.stdio;
import std.concurrency;

synchronized class A{
   private:
     int a;
   public:
     this() pure {
       a = 1;
     }

     int getA() pure{
       return a;
     }
}

void thread(shared A a){
   writeln(a.getA());
}

int main(){
   auto c = new shared A();
   spawn(&thread, c);
   return 0;
}
```


More information about the Digitalmars-d mailing list