#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

#include <immintrin.h>

static volatile double zr = 0.0;
static volatile double zi = 0.0;
static const double cr = 0.1;
static const double ci = 0.1;


static void
*run(void *arg)
{
  for (int i = 0; i < 1000000; ++i) {
    while (true) {
      if (_xbegin() == _XBEGIN_STARTED) {
	double oldzr = zr;
	double oldzi = zi;
	double newzr = oldzr * oldzr - oldzi * oldzi + cr;
	double newzi = 2 * oldzr * oldzi + ci;
	zr = newzr;
	zi = newzi;
	_xend();
	break;
      }
    }
  }
  return 0;
}

int
main(int argc, char **argv)
{
  int n = atoi(argv[1]);
  pthread_t *threads = new pthread_t[n];
  for (int i = 0; i < n; ++i) {
    pthread_create(&threads[i], 0, run, 0);
  }
  for (int i = 0; i < n; ++i) {
    pthread_join(threads[i], 0);
  }
  printf("%f + %fi\n", zr, zi);
  return 0;
}