C - более быстрая блокировка целого числа при использовании PThreads - PullRequest
1 голос
/ 19 октября 2011

У меня есть счетчик, который используется несколькими потоками для записи в определенный элемент в массиве. Вот что у меня пока ...

int count = 0;
pthread_mutex_t count_mutex;

void *Foo()
{
    // something = random value from I/O redirection
    pthread_mutex_lock(&count_mutex);
    count = count + 1;
    currentCount = count;
    pthread_mutex_unlock(&count_mutex);
    // do quick assignment operation. array[currentCount] = something
}
main()
{
    // create n pthreads with the task Foo
}

Проблема в том, что это безбожно медленно. Я принимаю файл целых чисел как перенаправление ввода / вывода и записываю их в массив. Кажется, что каждый поток тратит много времени в ожидании снятия блокировки. Есть ли более быстрый способ увеличить счетчик?

Примечание: мне нужно хранить числа в порядке, поэтому я должен использовать счетчик против, дающий каждому потоку определенный кусок массива для записи.

Ответы [ 2 ]

1 голос
/ 19 октября 2011

Вам необходимо использовать блокировку.Проверьте функцию Interlocked * в Windows, или функции Apple OSAtomic *, или, возможно, libatomic в Linux.

Если у вас есть компиляторкоторый хорошо поддерживает C ++ 11, вы даже можете использовать std :: atomic .

0 голосов
/ 19 октября 2011

Ну, один из вариантов - это где-то пакетировать изменения перед применением пакета к защищенному ресурсу.

Например, каждый поток собирает десять фрагментов информации (или меньше)если он закончится до того, как соберет десять), тогда измените Foo, чтобы взять длину и массив - таким образом, вы амортизируете стоимость блокировки, делая ее намного более эффективной.

Я также был бы оченьОсторожно:

// do quick assignment operation. array[currentCount] = something

за пределами защищенной зоны - это рецепт катастрофы, поскольку другой поток может изменить currentCount из-под вас.Это не проблема, если это локальная переменная, поскольку каждый поток будет иметь свою собственную копию, но из кода не ясно, какая область имеет эту переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...