Logo

Programming-Idioms

  • C++
  • Java
  • Dart
  • Clojure

Idiom #25 Send a value to another thread

Share the string value "Alan" with an existing running process which will then display "Hello, Alan"

(require '[clojure.core.async :refer :all])
(def c (chan 1))

(go (println "Hello," (<! c)))

(>!! c "Alan")
#include <future>
#include <mutex>
#include <iostream>
#include <optional>
#include <condition_variable>
//declaration
auto mutex = std::mutex{};
auto cv = std::condition_variable{};
auto variable = std::optional<std::string>{};
auto future = std::async([&]() {
	auto lock = std::unique_lock{mutex, std::defer_lock};
	cv.wait(lock, [&variable](){ return variable.has_value(); });
	std::cout << "Hello, " << *variable << "!" << std::endl;
});

//passing value in main thread (or it can be done in others as well)
{
	auto lock = std::unique_lock{mutex};
	variable = "Alan";
	cv.notify_all();
}
import static java.lang.System.out;
import static java.lang.Thread.sleep;
class Process {
    volatile String s;
    void f() throws InterruptedException {
        Thread a = new Thread(() -> {
            try {
                sleep(1_000);
                out.println("Hello, " + s);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
        a.start();
        sleep(500);
        s = "Alan";
    }
}
Process p = new Process();
p.f();

The `volatile` modifier toggles "atomic" access.

https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html
https://gist.github.com/f7c174c53efaba4d8575

I tried to put in in here, but it was just too long.
import "dart:isolate";
sendPort.send("value");

Ports are used for communicating between individually running isolates. The receiving isolate has created the corresponding receive-port and passed the send-port to this isolate.
declare

   task Greeter is
      entry Greet (Name : String);
   end Greeter;

   task body Greeter is
   begin

      accept Greet (Name : String) do
         Ada.Text_IO.Put_Line ("Hello, " & Name);
      end Greet;

   end Greeter;

begin
   Greeter.Greet ("Alan");
end;

This is called a rendez-vous in Ada. The caller is blocked until the Greet accept statement is completed.

New implementation...
< >
programming-idioms.org