AsyncQueue
Object Hierarchy:
Description:
[ Compact ]
[ CCode ( ref_function = "g_async_queue_ref" , unref_function = "g_async_queue_unref" ) ]
public class AsyncQueue<G>
  [ CCode ( ref_function = "g_async_queue_ref" , unref_function = "g_async_queue_unref" ) ]
public class AsyncQueue<G>
An opaque data structure which represents an asynchronous queue.
It should only be accessed through the `g_async_queue_*` functions.
Example: Async queue:
public class Calculation : Object {
	public char op;
	public int a;
	public int b;
	public Calculation (char op, int a, int b) {
		this.op = op;
		this.a = a;
		this.b = b;
	}
}
public static int main (string[] args) {
	if (Thread.supported () == false) {
		print ("Threads are not supported.\n");
		return 0;
	}
	AsyncQueue<Calculation> jobs = new AsyncQueue<Calculation> ();
	ThreadFunc<bool> worker_func = () => {
		while (true) {
			Calculation calc = jobs.pop ();
			switch (calc.op) {
			case '+':
				print ("Thread %p: %d + %d = %d\n", Thread<bool>.self<bool> (), calc.a, calc.b, calc.a + calc.b);
				break;
			case '-':
				print ("Thread %p: %d - %d = %d\n", Thread<bool>.self<bool> (), calc.a, calc.b, calc.a - calc.b);
				break;
			case '*':
				print ("Thread %p: %d * %d = %d\n", Thread<bool>.self<bool> (), calc.a, calc.b, calc.a * calc.b);
				break;
			case '/':
				print ("Thread %p: %d / %d = %d\n", Thread<bool>.self<bool> (), calc.a, calc.b, calc.a / calc.b);
				break;
			case '\0':
				return true;
			default:
				assert_not_reached ();
			}
		}
	};
	// Start threads:
	Thread<bool> thread1 = new Thread<bool> ("thread-1", worker_func);
	Thread<bool> thread2 = new Thread<bool> ("thread-2", worker_func);
	while (true) {
		print ("Operator: (+,-,*,/, exit)\n");
		string line = stdin.read_line ()._strip ();
		if (line == "exit") {
			break;
		}
		char op = '\0';
		int a = 0;
		int b = 0;
		switch (line) {
		case "+": op = '+'; break;
		case "-": op = '-'; break;
		case "*": op = '*'; break;
		case "/": op = '/'; break;
		default: print ("Invalid operator\n"); continue;
		}
		print ("Value 1:\n");
		a = int.parse (stdin.read_line ()._strip ());
		print ("Value 2:\n");
		b = int.parse (stdin.read_line ()._strip ());
		jobs.push (new Calculation (op, a, b));
	}
	// Quit all threads:
	jobs.push (new Calculation (0, 0, 0));
	jobs.push (new Calculation (0, 0, 0));
	thread1.join ();
	thread2.join ();
	jobs = null;
	return 0;
}valac --target-glib 2.32 --pkg glib-2.0 GLib.AsyncQueue.valaNamespace: GLib
  
  Package: glib-2.0