Index: benchmark/io/http/http_ring.cpp
===================================================================
--- benchmark/io/http/http_ring.cpp	(revision 3acbf899bd900ea4fc01c74a2119504101117519)
+++ benchmark/io/http/http_ring.cpp	(revision f3e87af512861070a0a9c8f2d5504688619cbe91)
@@ -45,5 +45,5 @@
 
 	int endfd;
-	unsigned entries;
+	struct io_uring * ring;
 
 	struct {
@@ -297,7 +297,5 @@
 	struct options_t & opt = *(struct options_t *)arg;
 
-	struct io_uring ring_storage;
-	struct io_uring * ring = &ring_storage;
-    	io_uring_queue_init(opt.entries, ring, 0);
+	struct io_uring * ring = opt.ring;
 
 	char endfd_buf[8];
@@ -348,10 +346,12 @@
 	}
 
-	io_uring_queue_exit(ring);
-
 	return (void*)count;
 }
 
 //=========================================================
+struct __attribute__((aligned(128))) aligned_ring {
+	struct io_uring storage;
+};
+
 #include <bit>
 
@@ -371,9 +371,10 @@
 	unsigned entries = 256;
 	unsigned backlog = 10;
+	bool attach = false;
 
 	//===================
 	// Arguments
 	int c;
-	while ((c = getopt (argc, argv, "t:p:e:b:")) != -1) {
+	while ((c = getopt (argc, argv, "t:p:e:b:a")) != -1) {
 		switch (c)
 		{
@@ -390,7 +391,10 @@
 			backlog = atoi(optarg);
 			break;
+		case 'a':
+			attach = true;
+			break;
 		case '?':
 		default:
-			std::cerr << "Usage: -t <threads> -p <port> -e <entries> -b <backlog>" << std::endl;
+			std::cerr << "Usage: -t <threads> -p <port> -e <entries> -b <backlog> -a" << std::endl;
 			return EXIT_FAILURE;
 		}
@@ -464,14 +468,31 @@
 	//===================
 	// Run Server Threads
-	std::cout << "Starting " << nthreads << " Threads" << std::endl;
-	pthread_t thrd_hdls[nthreads];
-	options_t thrd_opts[nthreads];
+	std::cout << "Starting " << nthreads << " Threads";
+	if(attach) {
+		std::cout << " with attached Rings";
+	}
+	std::cout << std::endl;
+
+	aligned_ring thrd_rings[nthreads];
+	pthread_t    thrd_hdls[nthreads];
+	options_t    thrd_opts[nthreads];
 	for(unsigned i = 0; i < nthreads; i++) {
+		if(!attach || i == 0) {
+			io_uring_queue_init(entries, &thrd_rings[i].storage, 0);
+		}
+		else {
+			struct io_uring_params p;
+			memset(&p, 0, sizeof(p));
+			p.flags = IORING_SETUP_ATTACH_WQ;
+			p.wq_fd = thrd_rings[0].storage.ring_fd;
+			io_uring_queue_init_params(entries, &thrd_rings[i].storage, &p);
+		}
+
 		thrd_opts[i].acpt.sockfd  = server_fd;
 		thrd_opts[i].acpt.addr    = (struct sockaddr *)&address;
 		thrd_opts[i].acpt.addrlen = (socklen_t*)&addrlen;
 		thrd_opts[i].acpt.flags   = 0;
-		thrd_opts[i].endfd   = efd;
-		thrd_opts[i].entries = entries;
+		thrd_opts[i].endfd        = efd;
+		thrd_opts[i].ring         = &thrd_rings[i].storage;
 
 		int ret = pthread_create(&thrd_hdls[i], nullptr, proc_loop, &thrd_opts[i]);
@@ -527,4 +548,6 @@
 		total += thrd_opts[i].result.subs;
 		count += thrd_opts[i].result.cnts;
+
+		io_uring_queue_exit(thrd_opts[i].ring);
 	}
 	std::cout << "done" << std::endl;
