How to correct share data between threads?

Konstantin Kutsevalov via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Nov 20 09:50:38 PST 2016


On Saturday, 19 November 2016 at 19:04:12 UTC, Nicolas Gurrola 
wrote:
> On Saturday, 19 November 2016 at 17:29:30 UTC, Konstantin 
> Kutsevalov wrote:
>> I need to receiving data in main thread and send its to other 
>> thread for processing. There is a simple (but wrong) code for 
>> example.
>> What need I to change to make it correct?
>>
>>
>> ```
>> import std.stdio, std.string, std.array, core.thread, 
>> std.datetime, std.conv;
>>
>> int main() {
>> 	Pumpurum pp = new Pumpurum();
>> 	Thread ppt = new Thread(&pp.processingData);
>> 	ppt.start();
>> 	while(pp.waitData())
>> 	{
>> 		// some operations may be
>> 	}
>> 	writeln("finished main");
>> 	return 0;
>> }
>>
>> class Pumpurum
>> {
>> 	private string[string] Data;
>> 	
>> 	private string[string] Result;
>> 	
>> 	private bool _quit = false;
>> 	
>> 	private int _counter = 0;
>> 	
>> 	bool waitData()
>> 	{
>> 		// waits for new data and adds to Data
>> 		string key;
>> 		string line = readln(); // just for example, in real its 
>> will be data from several socket connections
>> 		if (line !is null) {
>> 			if (line == "quit\n") {
>> 				this._quit = true;
>> 				return false;
>> 			}
>> 			key = Clock.currTime().toString() ~ " " ~ 
>> to!string(this._counter);
>> 			this.Data[key] = line; // adds new data to "Data"
>> 		}
>> 		return true;
>> 	}
>> 	
>> 	void processingData()
>> 	{
>> 		string key, value;
>> 		while(!this._quit) {
>> 			if (this.Data.length > 0) {
>> 				// todo checks the "Data" for some data, processing its 
>> and saves a result to "Result"
>> 				foreach (key, value; this.Data) {
>> 					writeln(value); // some processing :)
>> 					this.Result[key] = value;
>> 					this.Data.remove(key);
>> 				}
>> 			}
>> 		}
>> 		writeln("finished processing");
>> 	}
>> 	
>> }
>> ```
>>
>> Any advice may help. Thank you.
>
> I'd recommend using std.concurrency or std.parallelism instead 
> of core.thread, as they're higher level APIs. You probably want 
> to check out std.parallelism first to see if it has what you 
> need. Otherwise, the generic messaging API of std.concurrency 
> should be easier to use than core.thread while still being very 
> flexible.

Ok, thank you. But I cannot to find good example. May be you know 
some good article about it?



More information about the Digitalmars-d-learn mailing list