C中锁定的阻止列表

时间:2017-12-12 15:51:46

标签: c locking block mutex

在学习Mutex和Spinlock时,我听说有一个包含阻塞锁(或线程)的列表?在C.

但是,我不知道叫什么或它是什么。请告诉我它是什么。

谢谢。

2 个答案:

答案 0 :(得分:0)

在标准C中没有这样的东西,但你可以很容易地创建这样的东西。基本上你只是这样做:

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
struct mlist {
    int *l;
    int len;
};

void mlist_add(struct mlist *list, int obj) {
    pthread_mutex_lock(&mutex);
    mlist->l[mlist->len] = obj;
    mlist->len += 1;
    pthread_mutex_unlock(&mutex);
}

int mlist_get(int index) {
    pthread_mutex_lock(&mutex);
    int ret = mlist->l[index];
    pthread_mutex_unlock(&mutex);
}

显然这不是完全完整的代码,但这种类型的实际实现并没有太多工作。您只需要牢记数据安全。这实际上意味着在您处理共享数据时锁定线程。

答案 1 :(得分:0)

如果您正在谈论mutex,则有两个版本可用于锁定,可中断可中断联合

mutex_lock_interruptible()将当前流程置于 TASK_INTERRUPTIBLE state,所以当前进程会休眠,直到状态变为 TASK_RUNNING。对于TASK_INTERRUPTIBLE中的过程,有两种可能 可能会将流程状态更改为TASK_RUNNING的事件。第一个事件是 显然,当mutex可用时,如果有signal则是另一回事 交付给流程。

但是如果进程被置于 TASK_UNINTERRUPTIBLE 状态,那就是 我们调用mutex_lock()时唯一可以唤醒进程的事件 是availability of resource

使用忙碌等待

旋转锁定称为lock。为什么spin lock需要?我们可以使用semaphore/mutex中的interrupt handlers吗?答案是肯定的,不是。您可以使用向上和解锁,但无法使用向下和锁定,因为blocking calls放置了process to sleep我们是sleep in interrupt handlers不应该synchronization。那么,如果我们想在interrupt handlers中实现spinlock该怎么办?使用static spinlock_t slock; static unsigned int pwait = 10000; static ssize_t spin_write( struct file *filp, const char __user *buf,size_t sz, loff_t *fpos ) { printk("Write begins\n"); spin_lock( &slock ); printk("Write : Acquired a spinlock...\n"); mdelay( pwait ); /* Pretending to do some work */ printk("Write done. Releasing the spinlock\n"); spin_unlock( &slock ); return sz; } 。 例如

std::vector<int>::iterator it;
for (int a = 0; a < myvector.size(); a++){
    it = find(myvector.begin() + a, myvector.end(), myvector.at(a));
    std::cout << *it;
}

请参阅任何优秀的Linux内核书籍,您将获得所有这些。