digitalmars.D.learn - shared Variant[string]
- Fyodor Ustinov (18/18) Jan 28 2015 Hi!
- zhmt (3/21) Jan 28 2015 try __gshared
- Fyodor Ustinov (3/4) Jan 28 2015 It seems to me - is not the solution, it's a hack. I want to
- zhmt (4/8) Jan 28 2015 I am new to D. But I that error yesterday, and it's solved in
- Kagamin (3/3) Jan 28 2015 Associative array doesn't support thread-safe operations, that's
- Fyodor Ustinov (8/11) Jan 28 2015 If associative array does not support "share" attribute, this
- Tobias Pankrath (6/18) Jan 28 2015 In your case above, it's std.variant : Variant, which does not
- Fyodor Ustinov (4/6) Jan 28 2015 I look into variant.d and after seeing so many lines "@@@ BUG" -
- Meta (5/11) Jan 28 2015 AAs are a messy part of the language right now due to how they're
- Dominikus Dittes Scherkl (5/17) Jan 29 2015 string is a shorthand for "immutable char" - and immutables are
- Kagamin (4/4) Jan 28 2015 Some reading:
Hi! Simple program: import std.variant; shared Variant[string] t; void main() { t["t"] = "bebebe"; } Without "shared" this program compiles and works. With shared I get: aa.d(6): Error: template std.variant.VariantN!32LU.VariantN.opAssign cannot deduce function from argument types !()(string) shared, candidates are: /usr/include/dmd/phobos/std/variant.d(577): std.variant.VariantN!32LU.VariantN.opAssign(T)(T rhs) aa.d(6): Error: cannot implicitly convert expression (VariantN(& handler, cast(ubyte)0u, ).this("bebebe")) of type VariantN!32LU to shared(VariantN!32LU) Help me, please.
Jan 28 2015
On Wednesday, 28 January 2015 at 10:16:02 UTC, Fyodor Ustinov wrote:Hi! Simple program: import std.variant; shared Variant[string] t; void main() { t["t"] = "bebebe"; } Without "shared" this program compiles and works. With shared I get: aa.d(6): Error: template std.variant.VariantN!32LU.VariantN.opAssign cannot deduce function from argument types !()(string) shared, candidates are: /usr/include/dmd/phobos/std/variant.d(577): std.variant.VariantN!32LU.VariantN.opAssign(T)(T rhs) aa.d(6): Error: cannot implicitly convert expression (VariantN(& handler, cast(ubyte)0u, ).this("bebebe")) of type VariantN!32LU to shared(VariantN!32LU) Help me, please.try __gshared
Jan 28 2015
On Wednesday, 28 January 2015 at 10:20:42 UTC, zhmt wrote:try __gsharedIt seems to me - is not the solution, it's a hack. I want to understand what the happening. :)
Jan 28 2015
On Wednesday, 28 January 2015 at 10:32:56 UTC, Fyodor Ustinov wrote:On Wednesday, 28 January 2015 at 10:20:42 UTC, zhmt wrote:I am new to D. But I that error yesterday, and it's solved in that way, I dont understand the reason clearly.try __gsharedIt seems to me - is not the solution, it's a hack. I want to understand what the happening. :)
Jan 28 2015
Associative array doesn't support thread-safe operations, that's why they don't work on shared instance. You should use std.concurrency or implement low-level concurrency mechanism.
Jan 28 2015
On Wednesday, 28 January 2015 at 11:27:53 UTC, Kagamin wrote:Associative array doesn't support thread-safe operations, that's why they don't work on shared instance. You should use std.concurrency or implement low-level concurrency mechanism.If associative array does not support "share" attribute, this code should not be compiled without any warning or error, I think: shared string[string] t; void main() { t["t"] = "bebebe"; } But will.
Jan 28 2015
On Wednesday, 28 January 2015 at 12:29:09 UTC, Fyodor Ustinov wrote:On Wednesday, 28 January 2015 at 11:27:53 UTC, Kagamin wrote:In your case above, it's std.variant : Variant, which does not work when shared. You'll need to cast it and ensure yourself that no two threads access the same instance concurrently. I don't know, if AA should/do work with shared.Associative array doesn't support thread-safe operations, that's why they don't work on shared instance. You should use std.concurrency or implement low-level concurrency mechanism.If associative array does not support "share" attribute, this code should not be compiled without any warning or error, I think: shared string[string] t; void main() { t["t"] = "bebebe"; } But will.
Jan 28 2015
On Wednesday, 28 January 2015 at 12:32:29 UTC, Tobias Pankrath wrote:In your case above, it's std.variant : Variant, which does not work when shared.I look into variant.d and after seeing so many lines " BUG" - strange that it somehow works. :)
Jan 28 2015
On Wednesday, 28 January 2015 at 12:46:20 UTC, Fyodor Ustinov wrote:On Wednesday, 28 January 2015 at 12:32:29 UTC, Tobias Pankrath wrote:AAs are a messy part of the language right now due to how they're implemented. A new implementation is being worked on but it's a tricky thing to fix.In your case above, it's std.variant : Variant, which does not work when shared.I look into variant.d and after seeing so many lines " BUG" - strange that it somehow works. :)
Jan 28 2015
On Wednesday, 28 January 2015 at 12:29:09 UTC, Fyodor Ustinov wrote:On Wednesday, 28 January 2015 at 11:27:53 UTC, Kagamin wrote:string is a shorthand for "immutable char" - and immutables are shared by default. No thread can modify them, so default shared is safe for them.Associative array doesn't support thread-safe operations, that's why they don't work on shared instance. You should use std.concurrency or implement low-level concurrency mechanism.If associative array does not support "share" attribute, this code should not be compiled without any warning or error, I think: shared string[string] t; void main() { t["t"] = "bebebe"; } But will.
Jan 29 2015
Some reading: http://ddili.org/ders/d.en/concurrency.html http://ddili.org/ders/d.en/concurrency_shared.html http://www.informit.com/articles/article.aspx?p=1609144
Jan 28 2015