как сделать, чтобы 200 созданных мной потоков имели общий стек
Первая возможность - иметь глобальную переменную StackNode *top;
, но это проблема, если вы хотите повторно использовать один и тот же код для разных стеков.
Во-вторых, эта переменная должна быть локальной в main и давать ее адрес в параметре при запуске нового потока вместо NULL , который вы в настоящее время есть, то arg из testStack фактически является StackNode **
Не управляйте мьютексом до / после вызова push / pop , управляйте им внутри функций, иначе существует высокий риск забыть защиту. Таким образом, мьютекст не появляется в testStack . В этом случае предупреждение, см. Мой комментарий о is_empty
int is_empty(StackNode *top)
{
//--Tom you have not identified the critical lines of code and protected them
if (top == NULL)
return 1;
else
return 0;
}
почему так сложно?
int is_empty(StackNode *top)
{
//--Tom you have not identified the critical lines of code and protected them
return (top == NULL);
}
Да, стек не изменен и не смотрит внутрь, поэтому не критичен только для пустой точки зрения, поэтому предупреждение:
/* ptop is a StackNode ** */
if (!is_empty(*ptop))
// here the stack can be empty anyway because an other thread got the CPU
pop(ptop);
Если вы хотите предложить область защиты, в которой вы можете выполнять несколько операций, это должно быть сделано с использованием одного и того же мьютекса (возможно, скрытого функциями regionEnter и regionExit ) и потому что он также будет блокировать / разблокировать внутри вызываемой функции, что mutex должно быть рекурсивным (PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
)
Может быть интересно скрыть мьютекс , группирующий его и top в другой структуре, что позволяет не использовать мьютекс для разных стеков