On Monday, 2 December 2024 at 02:02:56 UTC, Ritina wrote:
How can I implement a program where I have a global integer variable g, and three threads: the first thread increments g by 1, the second thread increments g by 2, and the third thread increments g by 3? Additionally, while these threads are running, I should be able to access the value of g both inside and outside the threads.

When we ask claude.ai what is to be done, we get a very clear and great answer. This shows that D is an easy language. Yes, if the result is 600, each thread has increased it 100 times individually:

```d
import std.conv, std.stdio;
import core.sync.mutex;
import core.atomic;
import core.thread;

struct GlobalCounter
{
    // Mutex to protect shared access to the global variable
    private Mutex mutex;
    // The global integer variable to be incremented
    private shared int gInt;

    // Method to safely increment the global variable
    void increment(int value)
    {
        synchronized(mutex)
        {
            gInt.atomicOp!"+="(value);
        }
    }

    // Getter method to safely read the global variable
    string toString()
    {
        synchronized(mutex)
        {
            return gInt.to!string;
        }
    }
}

void main()
{
    // Create a shared counter instance
    GlobalCounter counter;

    // Initialize the mutex
    counter.mutex = new Mutex();

    // Create three threads with different increment values
    auto thread1 = new Thread(()
    {
        for (int i = 0; i < 100; i++)
        {
            counter.increment(1);
        }
    });

    auto thread2 = new Thread(()
    {
        for (int i = 0; i < 100; i++)
        {
            counter.increment(2);
        }
    });

    auto thread3 = new Thread(()
    {
        for (int i = 0; i < 100; i++)
        {
            counter.increment(3);
        }
    });

    // Start all threads
    thread1.start();
    thread2.start();
    thread3.start();

    // Wait for all threads to complete
    thread1.join();
    thread2.join();
    thread3.join();

    // Print the final value
    counter.writefln!"Final value: %s";
}
```

SDB@79
      • Re: Var... Salih Dincer via Digitalmars-d-learn
        • Re:... Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn
          • ... Salih Dincer via Digitalmars-d-learn
            • ... Ali Çehreli via Digitalmars-d-learn
            • ... Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn
              • ... Nick Treleaven via Digitalmars-d-learn
              • ... Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn
              • ... Ali Çehreli via Digitalmars-d-learn
              • ... Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn
              • ... Andy Valencia via Digitalmars-d-learn
  • Re: Variable mod... Salih Dincer via Digitalmars-d-learn

Reply via email to