2012-05-04 2 views
-2

Я делаю многопоточную программу C, которая включает в себя совместное использование глобального динамического целочисленного массива между двумя потоками. Один поток будет продолжать добавлять к нему элементы & другой будет независимо сканировать массив & бесплатно отсканированные элементы. может предложить любой из меня так, как я могу сделать это, потому что я делаю это создание тупиковой ситуации Пожалуйста, может ли один предоставить код для него или способ решения этой тупиковой ситуации с полным объяснениемМногопоточность и тупик

+6

Нет. Скопируйте свой код, чтобы мы могли его исправить. – nos

+0

На этот вопрос нельзя ответить как есть. Закрыть. – usr

+0

У меня нет кода uptill еще, я нахожусь в середине моего анализа и застрял в нем, поэтому мне нужен POC также –

ответ

1

Для резьбы I будет использовать pthread. Скомпилируйте его с помощью -pthread.

#include <pthread.h> 

int *array; 

// return and argument should be `void *` for pthread 
void *addfunction(void *p) { 
    // add to array 
} 

// same with this thread 
void *scanfunction(void *p) { 
    // scan in array 
} 

int main(void) { 
    // pthread_t variable needed for pthread 
    pthread_t addfunction_t, scanfunction_t; // names are not important but use the same for pthread_create() and pthread_join() 
    // start the threads 
    pthread_create(&addfunction_t, NULL, addfunction, NULL); // the third argument is the function you want to call in this case addfunction() 
    pthread_create(&scanfunction_t, NULL, scanfunction, NULL); // same for scanfunction() 
    // wait until the threads are finish leave out to continue while threads are running 
    pthread_join(addfunction_t, NULL); 
    pthread_join(scanfunction_t, NULL); 
    // code after pthread_join will executed if threads aren't running anymore 
} 

Вот хороший пример/учебник для PTHREAD: *klick*

+0

вы можете его объяснить больше –

+0

Его некоторые из того, насколько я полезен для вас, как-то полезен для меня, но не точно –

1

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

Без подробностей о работе «сканирования», особенно продолжительности и частоты, невозможно предложить стратегию связи потоков для хорошей производительности.

Anohter вещь ee не знаю, являются последствия отказа - не имеет значения, если новое дополнение находится в очереди на некоторое время, прежде чем вставлять его, или может.

Если вы хотите, чтобы «Computer Science 101» отвечал, возможно, очень плохой производительностью, заблокируйте каждый доступ к массиву с помощью мьютекса.

+0

Существует несколько потоков для написания что глобальный массив, но только один поток для его чтения и эта задача непрерывна, и я не уверен, какое время пишет нить или какой поток чтения читает время. Для этого мне нужно использовать взаимное исключение для этого или какого-либо другого метода для завершения этого –

+0

больше предложений –

0

http://www.liblfds.org

Выпуск 6 содержит очередь безблокировочного.

Компиляция из коробки для Windows и Linux.

Смежные вопросы