Доброго всем времени суток.
Возник такой вопрос. В C++ есть ключевое слово const. Для параметров и методов оно означает, грубо говоря, что внутри метода нельзя вызывать не константные методы для this и нельзя меня константные параметры. А можно ли придумать что-то похожее, но для пометки методов и функций, которые могут работать параллельно. Может есть какая-то тулза, которая проверяет C++ код и выдает ошибки, если из какой-то "многопоточной" функции вызывается не многопоточная. Конечно же, там должна быть какая-то штука, которая говорит, что кусок кода внутри многопоточной функции стал однопоточным (поставили критическую секцию и т.п.).
Здравствуйте, Аноним, Вы писали:
А>Доброго всем времени суток. А> Возник такой вопрос. В C++ есть ключевое слово const. Для параметров и методов оно означает, грубо говоря, что внутри метода нельзя вызывать не константные методы для this и нельзя меня константные параметры. А можно ли придумать что-то похожее, но для пометки методов и функций, которые могут работать параллельно. Может есть какая-то тулза, которая проверяет C++ код и выдает ошибки, если из какой-то "многопоточной" функции вызывается не многопоточная. Конечно же, там должна быть какая-то штука, которая говорит, что кусок кода внутри многопоточной функции стал однопоточным (поставили критическую секцию и т.п.).
Как вы себе это представляете?
Но думаю openMp это очень близко
Здравствуйте, Аноним, Вы писали:
А>Доброго всем времени суток. А> Возник такой вопрос. В C++ есть ключевое слово const. Для параметров и методов оно означает, грубо говоря, что внутри метода нельзя вызывать не константные методы для this и нельзя меня константные параметры. А можно ли придумать что-то похожее, но для пометки методов и функций, которые могут работать параллельно. Может есть какая-то тулза, которая проверяет C++ код и выдает ошибки, если из какой-то "многопоточной" функции вызывается не многопоточная. Конечно же, там должна быть какая-то штука, которая говорит, что кусок кода внутри многопоточной функции стал однопоточным (поставили критическую секцию и т.п.).
Здравствуйте, kvasya, Вы писали:
K>Как вы себе это представляете? K>Но думаю openMp это очень близко
Я это себе представляю примерно так:
class A
{
void DoSmth(int param) [multithreaded]
{
bla-bla-bla
if (CheckSmth())
bla-bla-bla
}
bool CheckSmth() [multithreaded]
{
bla-bla-bla
PreapareSmth(); // ошибка!!!
}
void PrepareSmth()
{
bla-bla-bla
}
};
после переделки получаем что-то типа:
class A
{
void DoSmth(int param) [multithreaded]
{
bla-bla-bla
if (CheckSmth())
bla-bla-bla
}
bool CheckSmth() [multithreaded]
{
bla-bla-bla
{ [singlethreaded]
mutex.lock();
PreapareSmth(); // ОК
mutex.unlock()
}
}
void PrepareSmth()
{
bla-bla-bla
}
};
Синтаксис придумал только-что, возможны более удачные варианты. Но суть, думаю понятна. Это, конечно, не убережет от всех проблем, но облегчит жизнь разработчику.
Здравствуйте, Аноним, Вы писали:
А>Синтаксис придумал только-что, возможны более удачные варианты. Но суть, думаю понятна. Это, конечно, не убережет от всех проблем, но облегчит жизнь разработчику.
Я не хотел бы делать каких-либо категоричных утверждений, но мне это напоминает
#include <msword>
int main( int argc, char ** argv )
{
return Winword.Execute();
}
Такой семантический анализ разве возможен в принципе? Что декларирует [multithread]? По каким принципам запрещен вызов из [multithread] в [singlethread], но разрешен в [multithread]?
Все таки думаю openmp ближе всех к теме. Но даже в этом не уверен.
Здравствуйте, Аноним, Вы писали:
А>Доброго всем времени суток. А> Возник такой вопрос. В C++ есть ключевое слово const. Для параметров и методов оно означает, грубо говоря, что внутри метода нельзя вызывать не константные методы для this и нельзя меня константные параметры. А можно ли придумать что-то похожее, но для пометки методов и функций, которые могут работать параллельно. Может есть какая-то тулза, которая проверяет C++ код и выдает ошибки, если из какой-то "многопоточной" функции вызывается не многопоточная.
Можешь volatile попробовать (но возможны побочные эффекты). У Александреску помнится статья на эту тему была. Ну а дополнительных cv-квалификаторов изобрести не получится, язык такое не поддерживает.
А> Конечно же, там должна быть какая-то штука, которая говорит, что кусок кода внутри многопоточной функции стал однопоточным (поставили критическую секцию и т.п.).
А вот это, увы, не выйдет.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Аноним, Вы писали:
А>Доброго всем времени суток. А> Возник такой вопрос. В C++ есть ключевое слово const. Для параметров и методов оно означает, грубо говоря, что внутри метода нельзя вызывать не константные методы для this и нельзя меня константные параметры. А можно ли придумать что-то похожее, но для пометки методов и функций, которые могут работать параллельно. Может есть какая-то тулза, которая проверяет C++ код и выдает ошибки, если из какой-то "многопоточной" функции вызывается не многопоточная. Конечно же, там должна быть какая-то штука, которая говорит, что кусок кода внутри многопоточной функции стал однопоточным (поставили критическую секцию и т.п.).
Александреску предлагает
volatile
Далее пользуешься как раз как const
class MyClass
{
// ...bool MyMethod() volatile;
// ...
};
Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>Здравствуйте, Аноним, Вы писали:
А>>Доброго всем времени суток. А>> Возник такой вопрос. В C++ есть ключевое слово const. Для параметров и методов оно означает, грубо говоря, что внутри метода нельзя вызывать не константные методы для this и нельзя меня константные параметры. А можно ли придумать что-то похожее, но для пометки методов и функций, которые могут работать параллельно. Может есть какая-то тулза, которая проверяет C++ код и выдает ошибки, если из какой-то "многопоточной" функции вызывается не многопоточная. Конечно же, там должна быть какая-то штука, которая говорит, что кусок кода внутри многопоточной функции стал однопоточным (поставили критическую секцию и т.п.).
ATP>Александреску предлагает ...
поправочка: предлагал... но после бурных обсуждений больше не предлагает... (почему? -- идем читать обсуждение в с++.модерейтед)
новый концепт таков (скопипакостничаю кусок кода у соседнего отвечающего :
[code]
class A
{
void DoSmth(int param)
{
bla-bla-bla
if (CheckSmth())
bla-bla-bla
}
т.е. не MT-safe функции получают ссылку на scoped_lock -- таким образом показывая что их надоо вызывать имея соответствующий лок... ну и без имения лока их тупо не вызвать...
можно конечно ошибиться если у тя в классе 2 mutex'a залочить не тот и передать... но обычно один
Здравствуйте, zaufi, Вы писали:
ATP>>Александреску предлагает ... Z>поправочка: предлагал... но после бурных обсуждений больше не предлагает... (почему? -- идем читать обсуждение в с++.модерейтед)
А в чем собственно дело там, в двух словах, ели не трудно ???
Здравствуйте, Аноним, Вы писали:
А>Доброго всем времени суток. А> Возник такой вопрос. В C++ есть ключевое слово const. Для параметров и методов оно означает, грубо говоря, что внутри метода нельзя вызывать не константные методы для this и нельзя меня константные параметры. А можно ли придумать что-то похожее, но для пометки методов и функций, которые могут работать параллельно. Может есть какая-то тулза, которая проверяет C++ код и выдает ошибки, если из какой-то "многопоточной" функции вызывается не многопоточная. Конечно же, там должна быть какая-то штука, которая говорит, что кусок кода внутри многопоточной функции стал однопоточным (поставили критическую секцию и т.п.).