在学习Mutex和Spinlock时,我听说有一个包含阻塞锁(或线程)的列表?在C.
但是,我不知道叫什么或它是什么。请告诉我它是什么。
谢谢。
答案 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内核书籍,您将获得所有这些。