多线程和死锁

时间:2012-05-04 11:04:39

标签: c multithreading deadlock

我正在制作一个多线程C程序,它涉及在两个线程之间共享一个全局动态整数数组。一个线程将继续向其添加元素&另一个将独立扫描阵列&释放扫描的元素。 任何人都可以建议我如何做到这一点,因为我正在做的是创造僵局 也请任何人提供它的代码或解决这个死锁的方法和完整的解释

3 个答案:

答案 0 :(得分:1)

对于线程,我会使用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*

答案 1 :(得分:1)

在这种情况下,您需要查看阵列上每个操作生成的频率和负载。例如,如果连续扫描阵列,但每小时只添加一次,那么它的价值在于找到一个非常慢,延迟的写入机制,从而消除了对读锁的需求。在这种情况下,用互斥锁锁定每次访问都是非常不令人满意的。

如果没有“扫描”操作的详细信息,尤其是持续时间和频率,则无法建议线程通信策略以获得良好的性能。

Anohter的事情ee不知道是失败的后果 - 如果一个新的添加在实际插入之前排队了一段时间可能无关紧要,或者可能。

如果你想要一个“计算机科学101”的答案,很可能是非常糟糕的性能,用互斥锁锁定对阵列的每次访问。

答案 2 :(得分:0)

http://www.liblfds.org

版本6包含无锁队列。

为Windows和Linux编译开箱即用。