2009-07-15 37 views
26

Có cách nào (POSIX-) di động trong C cho các hoạt động biến nguyên tử tương tự như một luồng di động với pthread?Hoạt động nguyên tử di động UNIX

Hoạt động nguyên tử là các hoạt động như "tăng và nhận" được thực thi một cách nguyên tử có nghĩa là không có chuyển đổi ngữ cảnh nào có thể can thiệp vào hoạt động. Trong không gian hạt nhân Linux, chúng ta phải loại atomic_t, trong Java, chúng tôi có gói java.util.concurrent.atomic.

Trên Linux, tệp atomic.h cung cấp các hoạt động nguyên tử, nhưng bao gồm phụ thuộc vào nền tảng, ví dụ: #include <asm-x86_64/atomic.h> và nó không có sẵn trên Mac OS X theo cách tương tự.

+0

Có một số GCC built-in, [mô tả ở đây] (http://gcc.gnu.org/onlinedocs/gcc-4.5.0/ gcc/Atomic-Builtins.html). – caf

+0

Rất tốt, chỉ giới hạn ở GCC, nhưng nó sẽ tốt cho tôi. – dmeister

+0

và tại đây để có gcc mới hơn: http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html – osgx

Trả lời

0

AFAIK không có cách nào đa nền tảng để thực hiện các hoạt động nguyên tử. Có thể có một thư viện ngoài kia nhưng tôi không biết. Nó không đặc biệt khó để cuộn của riêng bạn, mặc dù.

0

Tôi không nghĩ là có.

Một cách để giải quyết nó, giấy phép cho phép tất nhiên, sẽ là sao chép các triển khai trên mỗi kiến ​​trúc có liên quan từ ví dụ: không gian hạt nhân Linux. Tôi đã không theo dõi sự tiến hóa của những nguyên thủy một cách chặt chẽ, nhưng tôi đoán rằng chúng thực sự là nguyên thủy, tức là không phụ thuộc vào các dịch vụ hoặc API khác trong hạt nhân.

3

Không, POSIX không chỉ định mọi hoạt động không khóa/nguyên tử di động. Đó là lý do tại sao họ có pthreads.

Bạn sẽ phải sử dụng các cách không chuẩn hoặc gắn với ptrheads cho tính di động.

9

Vì bạn hỏi cho OS X:

(và kể từ platformity chéo được nuôi nấng trong chủ đề này.)

OS X có chức năng OSAtomicAdd32() và bạn bè. Chúng được khai báo trong "/usr/include/libkern/OSAtomic.h". Xem The Threading Programming guide, phần "Sử dụng hoạt động nguyên tử".

Và đối với Windows, có InterlockedIncrement() và bạn bè (xem MSDN).

Cùng với builtins gcc __sync_fetch_and_add() và bạn bè (đã được liên kết ở trên), bạn nên có một cái gì đó cho mọi nền tảng máy tính để bàn chính.

Xin lưu ý rằng tôi chưa tự mình sử dụng chúng, nhưng có thể sẽ làm như vậy trong vài ngày tới.

12

Đối với bất cứ ai tình cờ gặp điều này trong tương lai, nguyên tử C11 là cách tốt nhất để làm điều này ngay bây giờ - Tôi tin rằng chúng sẽ được đưa vào GCC 4.9.

+8

Bạn có thể mở rộng điều này không? – GraphicsMuncher

6

Kể từ C11, có một tùy chọn Atomic library cung cấp các hoạt động nguyên tử. Đây là di động cho bất kỳ nền tảng nào có trình biên dịch C11 (như gcc-4.9) với tính năng tùy chọn này.

Sự hiện diện của các nguyên tử có thể được kiểm tra với __STDC_NO_ATOMICS__ và sự hiện diện của <stdatomic.h>

nguyên tử.c

#include <stdio.h> 
#include <stdlib.h> 
#ifndef __STDC_NO_ATOMICS__ 
#include <stdatomic.h> 
#endif 

int main(int argc, char**argv) { 
    _Atomic int a; 
    atomic_init(&a, 42); 
    atomic_store(&a, 5); 
    int b = atomic_load(&a); 
    printf("b = %i\n", b); 

    return EXIT_SUCCESS; 
} 

Compiler invocations

clang -std=c11 atomic.c 
gcc -std=c11 atomic.c 
Các vấn đề liên quan