diff --git a/usbshm.c b/usbshm.c
index 78620727cdb3ffaa72e07e54166d5a541ca145d6..94c37bac0c1243baf25269864e7125b1966006ab 100644
--- a/usbshm.c
+++ b/usbshm.c
@@ -104,7 +104,8 @@ int usbshm_init(struct usbshm* instance, void (*dataCallback)(uint8_t request, u
 		pthread_mutex_init(libusbDataMutex, NULL);
 		pthread_create(&libusbThread, NULL, &usbshm_libusbPoll, NULL);
 	}
-	if(ret == 0) objectCounter++;
+	if(ret == 0)
+		objectCounter++;
 	return ret;
 }
 
@@ -179,12 +180,17 @@ int usbshm_open(struct usbshm* instance, int vendorID, int productID, const unsi
 
 bool usbshm_usbshm_isOpen(struct usbshm* instance)
 {
-	return instance->priv->handle != NULL;
+	pthread_mutex_lock(libusbDataMutex);
+	bool ret = instance->priv->handle != NULL;
+	pthread_mutex_unlock(libusbDataMutex);
+	return ret;
 }
 
 void usbshm_reset(struct usbshm* instance)
 {
+	pthread_mutex_lock(libusbDataMutex);
 	libusb_reset_device(instance->priv->handle);
+	pthread_mutex_unlock(libusbDataMutex);
 }
 
 void usbshm_reopen(struct usbshm* instance)
@@ -215,7 +221,6 @@ int usbshm_writeControlTransfer(struct usbshm* instance, const uint8_t request,
 		libusb_fill_control_transfer(instance->priv->transfer, instance->priv->handle, instance->priv->buffer, 
 									 &usbshm_transferCallBack, instance, 100);
 		int ret = libusb_submit_transfer(instance->priv->transfer);
-		pthread_mutex_unlock(libusbDataMutex);
 		if(ret < 0)
 		{
 			free(buffer);
@@ -223,6 +228,7 @@ int usbshm_writeControlTransfer(struct usbshm* instance, const uint8_t request,
 			instance->priv->transfer = NULL;
 			if(ret == LIBUSB_ERROR_NO_DEVICE) 
 				usbshm_reopen(instance);
+			pthread_mutex_unlock(libusbDataMutex);
 		}
 		return ret < 0 ? USBSHM_ERROR_ERR : 0;
 	}
@@ -245,7 +251,6 @@ int usbshm_readControlTransfer(struct usbshm* instance, const uint8_t request, c
 		libusb_fill_control_transfer(instance->priv->transfer, instance->priv->handle, instance->priv->buffer,
 			&usbshm_transferCallBack, instance, 100);
 		int ret = libusb_submit_transfer(instance->priv->transfer);
-		pthread_mutex_unlock(libusbDataMutex);
 		if(ret < 0)
 		{
 			free(instance->priv->buffer);
@@ -253,6 +258,7 @@ int usbshm_readControlTransfer(struct usbshm* instance, const uint8_t request, c
 			instance->priv->transfer = NULL;
 			if(ret == LIBUSB_ERROR_NO_DEVICE) 
 				usbshm_reopen(instance);
+			pthread_mutex_unlock(libusbDataMutex);
 		}
 		return ret < 0 ? USBSHM_ERROR_ERR : 0;
 	}
@@ -274,10 +280,14 @@ static void usbshm_transferCallBack(struct libusb_transfer *transfer)
 	free(context->priv->buffer);
 	libusb_free_transfer(context->priv->transfer);
 	context->priv->transfer = NULL;
+	pthread_mutex_unlock(libusbDataMutex);
 }
 
 int usbshm_readControlTransferSync(struct usbshm* instance, const uint8_t request, const uint16_t wValue, const uint16_t wIndex, uint8_t* buffer, const uint16_t length)
 {
-	return libusb_control_transfer(instance->priv->handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_IN,
-		request, wValue, wIndex, buffer, length, 2000);
+	pthread_mutex_lock(libusbDataMutex);
+	int ret = libusb_control_transfer(instance->priv->handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_IN,
+									 request, wValue, wIndex, buffer, length, 2000);
+	pthread_mutex_unlock(libusbDataMutex);
+	return ret;
 }