GVKun编程网logo

Linux 的信号量 (semaphore) 与互斥 (mutex)(linux信号量和互斥锁)

1

在这里,我们将给大家分享关于Linux的信号量(semaphore)与互斥(mutex)的知识,让您更了解linux信号量和互斥锁的本质,同时也会涉及到如何更有效地boost::mutex::time

在这里,我们将给大家分享关于Linux 的信号量 (semaphore) 与互斥 (mutex)的知识,让您更了解linux信号量和互斥锁的本质,同时也会涉及到如何更有效地boost :: mutex :: timed_lock不在Linux上、C pthread mutex:`{‘之前的预期表达式、c – Android NDK Mutex、c – 为什么sizeof(std :: mutex)== 40(gcc,clang,icc)?的内容。

本文目录一览:

Linux 的信号量 (semaphore) 与互斥 (mutex)(linux信号量和互斥锁)

Linux 的信号量 (semaphore) 与互斥 (mutex)(linux信号量和互斥锁)

在多线程编程中,出于各种原因我们会用到锁或者信号量等各种机制对一些操作进行控制,这里面就讲述 linux C 编程时,常用的两种方式:信号量方式  和 锁方式

锁:用来做互斥,用于保护某个资源在当下只能被多个线程中的一个访问,用于一个进程的多线程之间

信号量:用来做同步,用于保证多个线程之间按照既定顺序执行步骤,可以用于一个进程的多线程,据说也可以用于多个进程

wxy:锁是为了保护某个资源,从上锁的那一刻,如果不涉及资源 (多线程可访问的那些变量?或者叫全局变量,或者类中的成员变量等等...), 照样可以走下去

          信号量是为了同步的,从上信号量那一刻,就不能动了,除非另一个想成给我发信号 (post), 说你可以继续了,与是我才继续走下去

一:Mutex (锁)

1, 用法举例 (经试验)

//0.头文件引入
#include <mutex>

//1.定义锁
mutex mutex_me;

++++++线程1+++++++++ +++++++++线程2+++++++++

//2.上锁 //2.上锁 mutex_me.lock() mutex_me.lock() /*资源*/ //3.解锁 mutex_me.unlock() /*资源*/ //3.解锁
mutex_me.unlock()

 2,函数解析

void  lock() {
      int __e = __gthread_mutex_lock(&_M_mutex);
 }

static inline int  __gthread_mutex_lock (__gthread_mutex_t *__mutex){
  if (__gthread_active_p ())   //如果当前线程是活跃的
    return __gthrw_(pthread_mutex_lock) (__mutex);
  else
    return 0;
}

 

 

二,信号量

1,用法举例 (未经试验)

//0. 头文件引入
#include <semaphore.h>

//1. 定义 / 创建信号量
sem_t semaphoretcpItem;
sem_init(&semaphoretcpItem, 0, 1);

++++++ 线程 1+++++++++                 +++++++++ 线程 2+++++++++          +++++++ 线程 3++++++
//step1:等待信号量                                          //step2. 第一次释放信号量
while(true){                                             sem_post(&semaphoretcpItem);
  sem_wait(&semaphoretcpItem);
                            //step3. 第二次释放信号量
                            sem_post(&semaphoretcpItem);
  step4 * 3 次

}

 

解析:
1.wait 的时候要求信号量 > 0, 而初始信号量时 1,因此 wait 语句顺利通过,通过的同时信号量 - 1,此时线程 1 中的 while 第一轮循环是可以执行的;
2. 如果线程 2 和 3 都没有什么动作,则线程 1 在进入第二轮循环的时候阻塞在那里,直到线程 2 或 3 有 post, 于是信号量 + 1;
3,整体总结起来就是:线程 1 是否往下执行就看其他线程是否有动作,这样的逻辑就好比生产者消费者
我 (线程 1) 不瞎执行,累够呛,只有需要我干活的时候 (其他线程) 我再执行....

 2, 相关函数解析

sem_init (): 用来初始化一个信号量。

它的原型为:extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));

                        sem 为指向信号量结构的一个指针;

                        pshared 不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享;

                        value 给出了信号量的初始值。

sem_post (sem_t *sem): 用来增加信号量的值。

                        当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞,选择机制同样是由线程的调度策略决定的。 

sem_wait (sem_t *sem):被用来阻塞当前线程直到信号量 sem 的值大于 0,解除阻塞后将 sem 的值减一,表明公共资源经使用后减少。

sem_trywait (sem_t *sem):是函数 sem_wait () 的非阻塞版本,它直接将信号量 sem 的值减一。

sem_destroy (sem_t *sem):用来释放信号量 sem。

boost :: mutex :: timed_lock不在Linux上

boost :: mutex :: timed_lock不在Linux上

我有一个使用VS2010开发的应用程序,它使用Boost.Thread 1.48。

目前我正试图将应用程序移植到Linux上(在Debian 7上运行)。

当我尝试使用GCC 4.6或clang进行编译时,出现以下错误

error: ''class boost::mutex'' has no member named ''timed_lock''

是否有任何预处理器定义或编译器标志,我必须设置?

获取PostThreadMessage的boost :: thread的ID

在Windows上使用WaitForSingleObject,但支持提升线程中断

为什么Valgrind使用boost :: thread显示堆栈使用量增加?

如何使用助推primefaces来消除竞争条件?

启动Boost线程时保证

编辑:好的,我发现了这个问题。 我使用了以下内容:

myfile.h:

boost::mutex myMutex;

MYFILE.CPP

if(myMutex.timed_lock(boost::posix_time::millisec(10000))) { // Do stuff // ... // ... myMutex.unlock(); return true; } myMutex.unlock(); return false;

这适用于VS2008 / 2010。 在Linux下,我不得不把头改为:

boost::timed_mutex myMutex;

我还不是很确定,原因是什么。

Boost为同一个线程获取多个锁

get_id和GetCurrentThreadId之间的区别

Boost.Thread链接 – boost_thread与boost_thread-mt

在Windows平台的boost :: mutex和boost :: timed_mutex共享相同的实现。 这是一个实现细节。

如果你想使用timed_lock()作为Boost.Thread文件,你应该使用boost :: time_mutex。

http://www.boost.org/doc/libs/1_55_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_types.timed_mutex

总结

以上是小编为你收集整理的boost :: mutex :: timed_lock不在Linux上全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

C pthread mutex:`{‘之前的预期表达式

C pthread mutex:`{‘之前的预期表达式

我正在使用pthread库来创建两个线程.我使用两个队列来传递两个线程(生产者 – 消费者)之间的数据,因此希望有一个互斥体来同步线程中队列中的push-pops.

但我得到一个编译错误如下:

$gcc simple-tun.c simple-tun -lpthread
simple-tun.c: In function ‘new_queue’:
simple-tun.c:920:13: error: expected expression before ‘{’ token

我得到错误的函数是:

908 struct queue * new_queue () {
909 
910     struct queue * q;
911     q = (struct queue *) malloc (sizeof(struct queue));
912 
913     if (q == NULL)
914         return NULL;
915 
916 
917     q->head = NULL;
918     q->tail = NULL;
919     q->is_empty = 1;
920     q->mutex = PTHREAD_MUTEX_INITIALIZER;
921 
922     return q;
923 }

结构队列是:

struct queue {
 80     struct node * head;
 81     struct node * tail;
 82     int is_empty;
 83     pthread_mutex_t mutex;
 84 };

如果我注释掉第920行,链接器会开始提供“多个声明错误”

$gcc simple-tun.c simple-tun -lpthread
simple-tun: In function `settun':
(.text+0x2b7): multiple deFinition of `settun'
/tmp/cc5Ms4xP.o:simple-tun.c:(.text+0x1cb): first defined here
simple-tun: In function `_fini':
(.fini+0x0): multiple deFinition of `_fini'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o:(.fini+0x0): first defined here
simple-tun: In function `mktun':
(.text+0x1e2): multiple deFinition of `mktun'
/tmp/cc5Ms4xP.o:simple-tun.c:(.text+0xf6): first defined here
simple-tun: In function `net_connect':
(.text+0xe27): multiple deFinition of `net_connect'
/tmp/cc5Ms4xP.o:simple-tun.c:(.text+0x1115): first defined here
simple-tun: In function `data_start':
(.data+0x0): multiple deFinition of `__data_start'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o:(.data+0x0): first defined here
simple-tun: In function `client_connect':
(.text+0xe95): multiple deFinition of `client_connect'
/tmp/cc5Ms4xP.o:simple-tun.c:(.text+0x1183): first defined here
simple-tun: In function `data_start':
(.data+0x8): multiple deFinition of `__dso_handle'
/usr/lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o:(.data+0x0): first defined here
simple-tun:(.rodata+0x0): multiple deFinition of `_IO_stdin_used'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o:(.rodata.cst4+0x0): first defined here
simple-tun: In function `server_connect':
(.text+0xfa2): multiple deFinition of `server_connect'
/tmp/cc5Ms4xP.o:simple-tun.c:(.text+0x1290): first defined here
simple-tun: In function `print_usage':
(.text+0xe05): multiple deFinition of `print_usage'
/tmp/cc5Ms4xP.o:simple-tun.c:(.text+0x10f3): first defined here
simple-tun: In function `_init':
(.init+0x0): multiple deFinition of `_init'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o:(.init+0x0): first defined here
/usr/lib/gcc/x86_64-linux-gnu/4.7/crtend.o:(.tm_clone_table+0x0): multiple deFinition of `__TMC_END__'
simple-tun:(.data+0x10): first defined here
/usr/bin/ld: error in simple-tun(.eh_frame); no .eh_frame_hdr table will be created.
collect2: error: ld returned 1 exit status

我无法在搜索中找到解决方案.我的代码有什么根本原因吗?有人能帮助我发现我做错了吗?

如果我需要发布更多片段或更多输出,请告诉我.

解决方法

>您不能像这样使用PTHREAD_MUTEX_INITIALIZER – 它必须用作初始值设定项,而不是常规赋值表达式.您有两种方法可以解决它 – 调用pthread_mutex_init()或添加类型转换以使用PTHREAD_MUTEX_INITIALIZER作为复合文字.您的选择:
pthread_mutex_init(&q->mutex,NULL);

要么:

q->mutex = (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;

>您的链接器错误问题是由此命令行引起的:

gcc simple-tun.c simple-tun -lpthread

你错过了-o,所以你试图将程序与自己联系起来.那是个坏消息.你可能想要的是:

gcc simple-tun.c -o simple-tun -lpthread

实际上,你也应该在那里添加一些警告标志.

c – Android NDK Mutex

c – Android NDK Mutex

我正在尝试使用 Android Native Development Kit进行一些多线程,所以我需要一个互斥体.

使用Android NDK创建和使用互斥体的正确方法是什么?

谢谢

解决方法

NDK似乎支持 pthread mutexes.我没有自己使用它们.

c – 为什么sizeof(std :: mutex)== 40(gcc,clang,icc)?

c – 为什么sizeof(std :: mutex)== 40(gcc,clang,icc)?

参见英文答案 > boost::thread data structure sizes on the ridiculous side?4个
而不是sizeof(std :: atomic< bool>)== 1?

可以通过简单的std :: atomic< bool>来实现互斥锁,因此我认为互斥锁的大小可以小到那个,或者可能是4(32位).

解决方法

有了一个bool,你只能实现自旋锁.请注意,这将是一个不公平的锁,因为没有什么可以确保服务员排队,所以在极端情况下有可能在高争用情况下线程可以被永久阻止,因为它总是会失去获得锁的竞争.

互斥实现需要操作系统的支持才能使等待的线程进入休眠状态.因此,互斥锁需要一个标志,告诉它是否被锁定以及某种形式的队列描述符,它允许等待线程进入休眠状态并唤醒它们.如果您希望互斥锁能够支持递归锁定,健壮性,可选旋转,优先级反转保护等,则需要更多成员.

关于Linux 的信号量 (semaphore) 与互斥 (mutex)linux信号量和互斥锁的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于boost :: mutex :: timed_lock不在Linux上、C pthread mutex:`{‘之前的预期表达式、c – Android NDK Mutex、c – 为什么sizeof(std :: mutex)== 40(gcc,clang,icc)?等相关知识的信息别忘了在本站进行查找喔。

本文标签: