使用互斥锁和信号量处理线程(特别是在C++中)时,有一个简单的经验法则可以避免死锁并具有良好的干净同步效果吗?
我写了一个简单的程序,使用信号量解决了Readers-Writers问题.它在Linux操作系统上完美运行,但是当我在我的Mac OSX上运行时,我得到了意想不到的结果,我无法弄清楚原因.
我的计划:
#include <semaphore.h>
#include <sys/types.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* function1(void* val);
void* function2(void* val);
// shared values
volatile int X;
volatile int Y;
// declare semaphores
sem_t s1;
sem_t s2;
main()
{
void* status;
pthread_t thread1;
pthread_t thread2;
srand(time(NULL));
// initialize semaphores to zero
sem_init(&s1, 0, 0);
sem_init(&s2, 0, 0);
pthread_create(&thread1, NULL, function1, NULL);
pthread_create(&thread2, NULL, function2, NULL);
pthread_join(thread1, &status);
pthread_join(thread2, &status);
sem_destroy(&s1);
sem_destroy(&s2);
}
void* function1(void* val)
{
while(1)
{
X = rand()%1000; // …Run Code Online (Sandbox Code Playgroud) 在手册页中,即使您将信号量初始化为值1,也会显示:
sem_init(&mySem, 0, 1);
Run Code Online (Sandbox Code Playgroud)
多次调用时,它仍然可以增加到大于1的值
sem_post(&mySem);
Run Code Online (Sandbox Code Playgroud)
但在这个代码示例中,注释似乎有不同的看法:
sem_init(&mutex, 0, 1); /* initialize mutex to 1 - binary semaphore */
Run Code Online (Sandbox Code Playgroud)
是否可以在C中初始化严格的二进制信号量?
注意:在这种情况下执行此操作而不是使用互斥锁的原因是sem_post和sem_wait可能由不同的线程调用.
我想要一些关于互斥和信号量的澄清.
我的问题是,
我已经为生产者 - 消费者问题写了一个代码.但是我没有得到输出.没有编译错误,但在我的程序中发出警告.我很困惑.非常努力.但是无法得到它.请告诉我什么我的程序是错的.什么是正确的程序.我感到沮丧.请帮助伙计们.这是代码 -
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include </usr/include/semaphore.h>
#define BUFF_SIZE 5 /* total number of slots */
#define NP 3 /* total number of producers */
#define NC 3 /* total number of consumers */
#define NITERS 4 /* number of items produced/consumed */
typedef struct {
int buf[BUFF_SIZE]; /* shared var */
int in; /* buf[in%BUFF_SIZE] is the first empty slot */
int out; /* buf[out%BUFF_SIZE] is the first full slot */
sem_t full; /* …Run Code Online (Sandbox Code Playgroud) 我的任务是创建两个不同的C文件,然后使用信号量进行进程同步(我同时运行两个C文件).
我主要担心的是:如果我想在两个进程中访问信号量(C文件的可执行文件),我需要在共享内存中创建信号量.我还需要创建二进制信号量.
因为这是我的第一个程序,有人可以建议如何开始这个吗?
我能够创建和使用共享内存,在线程中使用信号量.我在YouTube上看了一些讲座,但找不到合适的解决方案.
我有一个相当复杂的WPF应用程序(很像VS2013)IDocuments并且ITools停靠在应用程序的主shell中.Tools当主窗口关闭时,其中一个需要安全关闭,以避免进入"坏"状态.所以我使用Caliburn Micro的public override void CanClose(Action<bool> callback)方法来执行一些数据库更新等.我遇到的问题是这个方法中的所有更新代码都使用MongoDB Driver 2.0,这个东西是async.一些代码; 目前我正在尝试表演
public override void CanClose(Action<bool> callback)
{
if (BackTestCollection.Any(bt => bt.TestStatus == TestStatus.Running))
{
using (ManualResetEventSlim tareDownCompleted = new ManualResetEventSlim(false))
{
// Update running test.
Task.Run(async () =>
{
StatusMessage = "Stopping running backtest...";
await SaveBackTestEventsAsync(SelectedBackTest);
Log.Trace(String.Format(
"Shutdown requested: saved backtest \"{0}\" with events",
SelectedBackTest.Name));
this.source = new CancellationTokenSource();
this.token = this.source.Token;
var filter = Builders<BsonDocument>.Filter.Eq(
BackTestFields.ID, DocIdSerializer.Write(SelectedBackTest.Id));
var update = Builders<BsonDocument>.Update.Set(BackTestFields.STATUS, …Run Code Online (Sandbox Code Playgroud) 我有多个线程访问外部资源 - 一个broswer.但是一次只能有一个线程访问它.所以,我正在使用信号量来同步它们.但是,一个线程从GUI获取输入然后访问浏览器以获得结果,应优先于其他线程,我不知道如何使用信号量来实现它.
我认为获取信号量后的每个线程都会检查队列中是否有优先级线程等待,如果是,则将其释放并再次等待.只有优先级线程在获取后才会释放它.
这是一个很好的解决方案还是我可以使用Java API中的其他任何东西?
我有一个使用sem_wait. 该POSIX规范说:
该
sem_wait()功能可通过信号传送中断。
此外,在关于错误的部分中,它说:
[EINTR] - 一个信号中断了这个功能。
但是,在我的程序中,发送信号不会解除调用的阻塞(并-1按照规范中的指示返回)。
一个最小的例子可以在下面找到。该程序sem_wait在发送信号后挂起并且永远不会解除阻塞。
#include <semaphore.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
sem_t sem;
void sighandler(int sig) {
printf("Inside sighandler\n");
}
void *thread_listen(void *arg) {
signal(SIGUSR1, &sighandler);
printf("sem_wait = %d\n", sem_wait(&sem));
return NULL;
}
int main(void) {
pthread_t thread;
sem_init(&sem, 0, 0);
pthread_create(&thread, NULL, &thread_listen, NULL);
sleep(1);
raise(SIGUSR1);
pthread_join(thread, NULL);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
程序输出Inside sighandler然后挂起。
还有另外一个问题在这里关于这一点,但它并没有真正提供任何清晰。
我误解了规范所说的内容吗?仅供参考,我的电脑使用 Ubuntu GLIBC …