diff -pur /tmp/orig/Digest-SHA3-1.04/SHA3.xs /tmp/multi/Digest-SHA3-1.04/SHA3.xs
--- orig/Digest-SHA3-1.04/SHA3.xs	2018-02-25 01:16:20.000000000 +0100
+++ multi/Digest-SHA3-1.04/SHA3.xs	2019-11-05 04:16:56.000000000 +0100
@@ -3,6 +3,8 @@
 #include "perl.h"
 #include "XSUB.h"
 
+#include "perlmulticore.h"
+
 #ifdef SvPVbyte
 	#if PERL_REVISION == 5 && PERL_VERSION < 8
 		#undef SvPVbyte
@@ -54,6 +56,9 @@ static SHA3 *getSHA3(pTHX_ SV *self)
 
 MODULE = Digest::SHA3		PACKAGE = Digest::SHA3
 
+BOOT:
+	perlmulticore_support ();
+
 PROTOTYPES: ENABLE
 
 int
@@ -143,13 +148,17 @@ CODE:
 	if (!shainit(&sha3, ix2alg[ix]))
 		XSRETURN_UNDEF;
 	for (i = 0; i < items; i++) {
+                int release;
 		data = (UCHR *) (SvPVbyte(ST(i), len));
+                release = len > 4000;
+                if (release) perlinterp_release ();
 		while (len > MAX_WRITE_SIZE) {
 			shawrite(data, MAX_WRITE_SIZE << 3, &sha3);
 			data += MAX_WRITE_SIZE;
 			len  -= MAX_WRITE_SIZE;
 		}
 		shawrite(data, (ULNG) len << 3, &sha3);
+                if (release) perlinterp_acquire ();
 	}
 	shafinish(&sha3);
 	len = 0;
@@ -192,13 +201,17 @@ PPCODE:
 	if ((state = getSHA3(aTHX_ self)) == NULL)
 		XSRETURN_UNDEF;
 	for (i = 1; i < items; i++) {
+                int release;
 		data = (UCHR *) (SvPVbyte(ST(i), len));
+                release = len > 4000;
+                if (release) perlinterp_release ();
 		while (len > MAX_WRITE_SIZE) {
 			shawrite(data, MAX_WRITE_SIZE << 3, state);
 			data += MAX_WRITE_SIZE;
 			len  -= MAX_WRITE_SIZE;
 		}
 		shawrite(data, (ULNG) len << 3, state);
+                if (release) perlinterp_acquire ();
 	}
 	XSRETURN(1);
 
