3

Linux カーネルのpthread_mutex_lockとに相当するものは何ですか。pthread_cond_waitおよびそれらの使用方法。簡単な (Hello World) 例を教えてください。

4

3 に答える 3

4
  • ミューテックスの場合(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>

于 2012-05-30T17:16:35.983 に答える
3

カーネル モジュールはカーネルに直接リンクするため、カーネル空間でライブラリ呼び出しを使用することはできません。

以下を使用できます。

mutex_lock()&mutex_unlock()

linux/mutex.hから提供されます。

于 2012-04-11T11:18:18.010 に答える
2

私はずっと前(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;
于 2012-04-12T04:06:26.773 に答える