Linux カーネルのpthread_mutex_lock
とに相当するものは何ですか。pthread_cond_wait
およびそれらの使用方法。簡単な (Hello World) 例を教えてください。
3 に答える
- ミューテックスの場合(Alsが言ったように):
mutex_lock()
そして、 (from )mutex_unlock()
で使用する前にミューテックスを初期化する必要があります。mutex_init()
#include <linux/mutex.h>
- 同等の
pthread_cond_wait
wait_event_interruptible()
そして、 (から )wake_up_interruptible()
でwait_queue_headを初期化する必要がありますinit_waitqueue_head()
#include <linux/wait.h>
カーネル モジュールはカーネルに直接リンクするため、カーネル空間でライブラリ呼び出しを使用することはできません。
以下を使用できます。
mutex_lock()
&mutex_unlock()
linux/mutex.hから提供されます。
私はずっと前(1999年頃)にLinuxカーネルプログラミング用のミューテックスと条件ライブラリを作成し、それ以来さまざまなプロジェクトで使用していました。
私はそれをLMC(Linuxミューテックスと条件変数)と呼びました。これは、カーネルにミューテックスタイプが存在する前のことです。
http://www.kylheku.com/~kaz/lmc.html
最近、私は、セマンティクスが「条件変数を待機するためにミューテックスを放棄し、同時に、指定されたタイムアウトまで複数のファイル記述子をポーリングする」というクールな新しい関数を追加しました。
さまざまな共有オブジェクトの更新を監視し、同時にカーネルソケットと通信する、この内部カーネルスレッドを使用しました。
見てみな:
/**
* Atomically give up the mutex and wait on the condition variable.
* Wake up if the specified timeout elapses, or if a signal is delivered.
* Additionally, also wait on the specified file descriptors to become
* ready, combining condition waiting with poll().
* KCOND_WAIT_SUCCESS means the condition was signaled, or one or more
* file descriptors are ready.
* Also, a negative value can be returned indicating an error!
* (The poll needs to dynamically allocate some memory for the wait table).
* The timeout is relative to the current time, specifying how long to sleep in
* jiffies (CPU clock ticks).
*/
int kcond_timed_wait_rel_poll(kcond_t *, kmutex_t *, long,
kcond_poll_t *, unsigned int);
構造の配列はkcond_poll_t
、自分で作成して埋める必要があるものであり、構造は次のようになります。struct socket *
タイプフィールドがあるので、ソケット( )またはファイル(struct file *
)のいずれかを待つことができます。
/**
* Structure for file-descriptor polling condition waits.
* This resembles struct pollfd, but uses a direct file descriptor
* pointer rather than a file descriptor number. Also,
* it contains the wait queue by which the process is enqueued
* to wait on that descriptor. Thus our poll function doesn't
* have to dynamically allocate wait queue tables. It gets
* them from this array! (But this means that the array cannot
* be used by multiple threads at the same time to do polling!)
*/
typedef struct {
kcond_poll_type_t type; /* Must set this. */
union { /* Must set union field according to type. */
struct file *file;
struct socket *sock;
} obj;
short events; /* And this. */
short revents; /* Check response in this. */
wait_queue_t wait; /* Internal, don't set. */
wait_queue_head_t *queue; /* Internal, don't set */
} kcond_poll_t;