diff --git a/server/mpm/prefork/prefork.c b/server/mpm/prefork/prefork.c
index 9f80006..5d4deb5 100644
--- a/server/mpm/prefork/prefork.c
+++ b/server/mpm/prefork/prefork.c
@@ -90,8 +90,12 @@
 
 /* config globals */
 
+#define TOTAL_ACCEPT_MUTEX_NUMBER 4
+
 int ap_threads_per_child=0;         /* Worker threads per child */
-static apr_proc_mutex_t *accept_mutex;
+static apr_proc_mutex_t* accept_mutex_array[TOTAL_ACCEPT_MUTEX_NUMBER];
+static int my_mutex_by_pid = 0;
+static const char *my_ap_lock_fname = NULL;  
 static int ap_daemons_to_start=0;
 static int ap_daemons_min_free=0;
 static int ap_daemons_max_free=0;
@@ -202,7 +206,7 @@ static void clean_child_exit(int code)
 
 static void accept_mutex_on(void)
 {
-    apr_status_t rv = apr_proc_mutex_lock(accept_mutex);
+    apr_status_t rv = apr_proc_mutex_lock(accept_mutex_array[my_mutex_by_pid]);
     if (rv != APR_SUCCESS) {
         const char *msg = "couldn't grab the accept mutex";
 
@@ -220,7 +224,7 @@ static void accept_mutex_on(void)
 
 static void accept_mutex_off(void)
 {
-    apr_status_t rv = apr_proc_mutex_unlock(accept_mutex);
+    apr_status_t rv = apr_proc_mutex_unlock(accept_mutex_array[my_mutex_by_pid]);
     if (rv != APR_SUCCESS) {
         const char *msg = "couldn't release the accept mutex";
 
@@ -503,11 +507,16 @@ static void child_main(int child_num_arg)
 
     /* needs to be done before we switch UIDs so we have permissions */
     ap_reopen_scoreboard(pchild, NULL, 0);
-    status = apr_proc_mutex_child_init(&accept_mutex, ap_lock_fname, pchild);
+
+    my_mutex_by_pid = ap_my_pid % TOTAL_ACCEPT_MUTEX_NUMBER;
+    
+    my_ap_lock_fname = apr_psprintf(pchild, "%s_%d", ap_lock_fname, my_mutex_by_pid);
+	
+    status = apr_proc_mutex_child_init(&accept_mutex_array[my_mutex_by_pid], my_ap_lock_fname, pchild);
     if (status != APR_SUCCESS) {
         ap_log_error(APLOG_MARK, APLOG_EMERG, status, ap_server_conf,
                      "Couldn't initialize cross-process lock in child "
-                     "(%s) (%d)", ap_lock_fname, ap_accept_lock_mech);
+                     "(%s) (%d)", my_ap_lock_fname, ap_accept_lock_mech);
         clean_child_exit(APEXIT_CHILDFATAL);
     }
 
@@ -928,6 +937,8 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
     int index;
     int remaining_children_to_start;
     apr_status_t rv;
+    int i;
+    char * tmp_lock_fname;
 
     ap_log_pid(pconf, ap_pid_fname);
 
@@ -944,31 +955,37 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
                                  ap_server_root_relative(_pconf, ap_lock_fname),
                                  ap_my_pid);
 
-    rv = apr_proc_mutex_create(&accept_mutex, ap_lock_fname,
-                               ap_accept_lock_mech, _pconf);
-    if (rv != APR_SUCCESS) {
-        ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s,
-                     "Couldn't create accept lock (%s) (%d)",
-                     ap_lock_fname, ap_accept_lock_mech);
-        mpm_state = AP_MPMQ_STOPPING;
-        return 1;
+    for (i = 0 ; i < TOTAL_ACCEPT_MUTEX_NUMBER ; ++i) {
+									 
+       tmp_lock_fname = apr_psprintf(_pconf, "%s_%d", ap_lock_fname, i);
+    
+       rv = apr_proc_mutex_create(&accept_mutex_array[i], tmp_lock_fname,
+								   ap_accept_lock_mech, _pconf);
+       if (rv != APR_SUCCESS) {
+          ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s,
+                       "Couldn't create accept lock (%s) (%d)",
+                       tmp_lock_fname, ap_accept_lock_mech);
+          mpm_state = AP_MPMQ_STOPPING;
+          return 1;
     }
+	
 
 #if APR_USE_SYSVSEM_SERIALIZE
-    if (ap_accept_lock_mech == APR_LOCK_DEFAULT ||
-        ap_accept_lock_mech == APR_LOCK_SYSVSEM) {
+		if (ap_accept_lock_mech == APR_LOCK_DEFAULT ||
+			ap_accept_lock_mech == APR_LOCK_SYSVSEM) {
 #else
-    if (ap_accept_lock_mech == APR_LOCK_SYSVSEM) {
+		if (ap_accept_lock_mech == APR_LOCK_SYSVSEM) {
 #endif
-        rv = unixd_set_proc_mutex_perms(accept_mutex);
-        if (rv != APR_SUCCESS) {
-            ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s,
-                         "Couldn't set permissions on cross-process lock; "
-                         "check User and Group directives");
-            mpm_state = AP_MPMQ_STOPPING;
-            return 1;
-        }
-    }
+			rv = unixd_set_proc_mutex_perms(accept_mutex_array[i]);
+			if (rv != APR_SUCCESS) {
+				ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s,
+							 "Couldn't set permissions on cross-process lock; "
+							 "check User and Group directives");
+				mpm_state = AP_MPMQ_STOPPING;
+				return 1;
+			}
+		}
+	}
 
     if (!is_graceful) {
         if (ap_run_pre_mpm(s->process->pool, SB_SHARED) != OK) {
@@ -1022,7 +1039,7 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
 #ifdef AP_MPM_WANT_SET_ACCEPT_LOCK_MECH
     ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf,
                 "AcceptMutex: %s (default: %s)",
-                apr_proc_mutex_name(accept_mutex),
+                apr_proc_mutex_name(accept_mutex_array[0]),
                 apr_proc_mutex_defname());
 #endif
     restart_pending = shutdown_pending = 0;
