小编sna*_*nap的帖子

互斥是否需要在pthreads之间同步一个简单的标志?

让我们假设我有一些工作线程如下:

while (1) {
    do_something();

    if (flag_isset())
        do_something_else();
}
Run Code Online (Sandbox Code Playgroud)

我们有几个帮助函数来检查和设置标志:

void flag_set()   { global_flag = 1; }
void flag_clear() { global_flag = 0; }
int  flag_isset() { return global_flag; }
Run Code Online (Sandbox Code Playgroud)

因此,线程继续do_something()在忙循环中调用,并且如果某些其他线程设置global_flag线程也调用do_something_else()(例如,可以通过从另一个线程设置标志来请求时输出进度或调试信息).

我的问题是:我是否需要做一些特殊的事情来同步对global_flag的访问?如果是,那么以便携方式进行同步的最小工作究竟是什么?

我试图通过阅读许多文章来解决这个问题,但我仍然不太确定正确的答案......我认为它是以下之一:

答:无需同步,因为设置或清除标志不会产生竞争条件:

我们只需要定义标志,volatile以确保每次检查时都从共享内存中读取它:

volatile int global_flag;
Run Code Online (Sandbox Code Playgroud)

它可能不会立即传播到其他CPU核心,但迟早会保证.

B:需要完全同步以确保在线程之间传播对标志的更改:

在一个CPU核心中设置共享标志不一定会让另一个核心看到它.我们需要使用互斥锁来确保通过使其他CPU上的相应缓存行无效来传播标志更改.代码如下:

volatile int    global_flag;
pthread_mutex_t flag_mutex;

void flag_set()   { pthread_mutex_lock(flag_mutex); global_flag = 1; pthread_mutex_unlock(flag_mutex); }
void flag_clear() { pthread_mutex_lock(flag_mutex); global_flag = 0; pthread_mutex_unlock(flag_mutex); }

int  flag_isset()
{
    int rc;
    pthread_mutex_lock(flag_mutex);
    rc …
Run Code Online (Sandbox Code Playgroud)

c synchronization pthreads

16
推荐指数
1
解决办法
6459
查看次数

如何使用另一个SCM提供Git存储库的双向镜像?(bzr,hg等)

在过去的6个月左右的时间里,我一直在使用我们主要Perforce存储库的双向Git镜像来评估它的工作流程.我不得不说我已经爱上了它,但到目前为止它对我来说有一个致命的缺陷:它的Windows支持非常糟糕.

一般来说这对我来说不是问题,但现在却是.我需要在我的Git仓库中对一些本地承诺的工作做一些工作,而我无法从我需要处理的机器上找到它,因为这个盒子上的Git发行版存在一些无法解决的问题.

无论如何,如果可以的话,我想要做的就是运行第二个镜像:这次捎带我的Git存储库但是通过Mercurial或Bazar服务.我发现了一些看起来很有前途的工具,博客评论中有一些参考文献说人们已经这样做但没有完成.

因此,谁能告诉我,如果有一个简单的方法来保持一个双向镜使用另一个DVCS是一个Git仓库在Windows上没有任何麻烦?

提前感谢您的烦恼......

杰米

git version-control mercurial dvcs bazaar

7
推荐指数
1
解决办法
1780
查看次数

如何以原子方式将行从一个表移动到另一个表?

我正在从几千个传感器中收集读数并将它们存储在MySQL数据库中.每秒有几百个插入.为了提高插入性能,我将这些值最初存储到MEMORY缓冲区表中.每分钟我运行一个存储过程,将插入的行从内存缓冲区移动到永久表.

基本上我想在我的存储过程中执行以下操作来从临时缓冲区移动行:

INSERT INTO data SELECT * FROM data_buffer;
DELETE FROM data_buffer;
Run Code Online (Sandbox Code Playgroud)

遗憾的是前一个不可用,因为数据收集过程在上面的INSERT和DELETE之间的"data_buffer"中插入了额外的行.因此,这些行将被删除而不会插入"数据"表.

如何使操作原子化或使DELETE语句只删除前面语句中SELECTed和INSERTed的行?

我希望以标准方式执行此操作,如果可能的话,该方法适用于不同的数据库引擎.

由于性能开销和存储要求,我不希望添加任何额外的"id"列.

我希望标准SQL中有SELECT_AND_DELETE或MOVE语句或类似的东西......

mysql sql atomic

5
推荐指数
1
解决办法
7780
查看次数

SCIM 的 Java 实现

SCIM 是由 Google、Salesforce、Ping Identity 等提出的新的用户配置标准。是否有现有的 Java 实现来支持这一点?

java identity

5
推荐指数
1
解决办法
8122
查看次数

标签 统计

atomic ×1

bazaar ×1

c ×1

dvcs ×1

git ×1

identity ×1

java ×1

mercurial ×1

mysql ×1

pthreads ×1

sql ×1

synchronization ×1

version-control ×1